我有一个问题,我无法序列64位整数(32位作品)连载64位宽度整数
代码如下:
uint64_t t = (uint64_t) 0;
uint8_t buffer[8];
buffer[0] = 0x12;
buffer[1] = 0x34;
buffer[2] = 0x56;
buffer[3] = 0x78;
buffer[4] = 0x9A;
buffer[5] = 0xBC;
buffer[6] = 0xDE;
buffer[7] = 0xF0;
printf("uint64_t width: %lu\n",sizeof(t));
t |= (uint64_t) ((buffer[7] << (7*8)) & 0xFF00000000000000);
t |= (uint64_t) ((buffer[6] << (6*8)) & 0x00FF000000000000);
t |= (uint64_t) ((buffer[5] << (5*8)) & 0x0000FF0000000000);
t |= (uint64_t) ((buffer[4] << (4*8)) & 0x000000FF00000000);
t |= (uint64_t) ((buffer[3] << (3*8)) & 0x00000000FF000000);
t |= (uint64_t) ((buffer[2] << (2*8)) & 0x0000000000FF0000);
t |= (uint64_t) ((buffer[1] << (1*8)) & 0x000000000000FF00);
t |= (uint64_t) ((buffer[0]) & 0x00000000000000FF);
printf("uint64 value: 0x%llu\n",t);
但是编译器警告我,我有位对于高32位移动太远了。 sizeof运算符告诉我它的64位宽度?
输出为:
uint64_t width: 8
uint64 value: 0x78563412
怎么回事请告诉我?
+1正要张贴此。该面具不需要后缀[6.4.4.1.5](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)。 '(buffer [7] <<(7 * 8LLU))'可以减少输入。 – user786653
@ user786653:是的,我认为你是对的 - 我总是在这种情况下添加'LLU',因为它使得代码更加自明和清晰,但它可能不是必须的。 –
我同意,如果没有其他答案将此称为*代码中的缺陷,我就不会那么迂腐了。 – user786653