While trying to read and write some unsinged long long int
values to and from a file i encountered a problem when deserializing the values. The boiled down problem can be reproduced with the following code. Only sometimes bitshifting more than 32 bit result in value with leading ones. Why is that?
int main() {
unsigned char* myBuffer = new unsigned char[16] {
(unsigned char)0xb0,
(unsigned char)0xf7,
(unsigned char)0x80,
(unsigned char)0x01,
(unsigned char)0x00,
(unsigned char)0x00,
(unsigned char)0x00,
(unsigned char)0x00,
(unsigned char)0xf0,
(unsigned char)0xc0,
(unsigned char)0x49,
(unsigned char)0x89,
(unsigned char)0x29,
(unsigned char)0x00,
(unsigned char)0x00,
(unsigned char)0x00
};
unsigned long long int firstValue = 0;
unsigned long long int secondValue = 0;
for (int i = 0; i < 8; i++) {
firstValue |= myBuffer[i] << (8 * i);
secondValue |= myBuffer[i + 8] << (8 * i);
std::cout << "first buffer value " << std::hex << (int)myBuffer[i]
<< " second buffer value " << std::hex << (int)myBuffer[i + 8]
<< " first value " << std::hex << firstValue
<< " second value " << secondValue << endl;
}
return 0;
}
Output
first buffer value b0 second buffer value f0 first value b0 second value f0
first buffer value f7 second buffer value c0 first value f7b0 second value c0f0
first buffer value 80 second buffer value 49 first value 80f7b0 second value 49c0f0
first buffer value 1 second buffer value 89 first value 180f7b0 second value ffffffff8949c0f0
first buffer value 0 second buffer value 29 first value 180f7b0 second value ffffffff8949c0f9
first buffer value 0 second buffer value 0 first value 180f7b0 second value ffffffff8949c0f9
first buffer value 0 second buffer value 0 first value 180f7b0 second value ffffffff8949c0f9
first buffer value 0 second buffer value 0 first value 180f7b0 second value ffffffff8949c0f9
Solution
I know how to fix this issue. By casting the unsigned char
's to an unsigned long long int
before bitshifting everything works well:
secondValue |= ((unsigned long long int)myBuffer[i + 8]) << (8 * i);
I still just want to know why this is happening only sometimes.