Ik ben redelijk bekend met de datatypen en de bijbehorende limieten in C++, maar ik betrap mezelf er keer op keer op dat ik eigenlijk niet weet waarom ik cast.
Neem het volgende stukje code uit een audiomixer die ik pas geleden heb geschreven:
Ik vermenigvuldig dus de waarde _buffer[i], een int16, met de fractionele waarde _vol_l / 255, welke dus een float of een double moet zijn? Uiteindelijk blijkt de volgende code te werken:
Maar ik vind het nogal triviaal en weet niet waarom bv. _buffer[i] geen cast vereist. Wie kan me uitleggen hoe C++ omgaat met casts en berekeningen of me naar een pagina doorverwijzen waar het goed beschreven staat?
edit:
...en nog iets, waarom zijn (int8 *) en (char *) niet hetzelfde, als ik int8 als volgt gedefinieerd heb?
Ik gebruik gcc.
Neem het volgende stukje code uit een audiomixer die ik pas geleden heb geschreven:
C++:
1
2
3
4
5
6
7
8
9
10
| typedef signed short int16; typedef unsigned char uint8; ... uint8 _vol_l; int16 *_buffer; ... function mix(int16 *ptr) { ... ptr[i] += (_buffer[i] * (_vol_l / 255)); ... |
Ik vermenigvuldig dus de waarde _buffer[i], een int16, met de fractionele waarde _vol_l / 255, welke dus een float of een double moet zijn? Uiteindelijk blijkt de volgende code te werken:
C++:
1
| ptr[i] += (int16)(_buffer[i] * ((float)_vol_l / 255)); |
Maar ik vind het nogal triviaal en weet niet waarom bv. _buffer[i] geen cast vereist. Wie kan me uitleggen hoe C++ omgaat met casts en berekeningen of me naar een pagina doorverwijzen waar het goed beschreven staat?
edit:
...en nog iets, waarom zijn (int8 *) en (char *) niet hetzelfde, als ik int8 als volgt gedefinieerd heb?
C++:
1
| typedef signed char int8; |
Ik gebruik gcc.
[ Voor 9% gewijzigd door JeRa op 01-03-2004 18:34 . Reden: nog 'n vraag :-) ]