右移计数> =类型宽度或左移位数> =类型宽度
我是新手,我试图使用UDP发送64位值。
int plugin(unsigned char *Buffer) { static const uint8_t max_byte = 0xFF; uint8_t id[8]; id[0] = (uint8_t)((Buffer[0]) & max_byte); id[1] = (uint8_t)((Buffer[1] >> 8) & max_byte); id[2] = (uint8_t)((Buffer[2] >> 16) & max_byte); id[3] = (uint8_t)((Buffer[3] >> 24) & max_byte); id[4] = (uint8_t)((Buffer[4] >> 32) & max_byte); id[5] = (uint8_t)((Buffer[5] >> 40) & max_byte); id[6] = (uint8_t)((Buffer[6] >> 48) & max_byte); id[7] = (uint8_t)((Buffer[7] >> 56) & max_byte); }
我收到错误右移计数> =类型的宽度。 我尝试过其他方式
int plugin(unsigned char *Buffer) { uint64_t id = (Buffer[0] | Buffer[1] << 8 | Buffer[2] << 16 | Buffer[3] << 24 | Buffer[4] < 32 | Buffer[5] << 40 | Buffer[6] << 48 | Buffer[7] << 56); printf("ID %" PRIu64 "\n", id); }
它的获取错误左移位数> =类型I的宽度检查系统它是x86_64。 有人可以告诉我它发生的原因吗? 请建议我前进的方向。
这是因为默认的整数提升,基本上。
当你这样做:
uint64_t id = Buffer[7] << 56;
那个Buffer[7]
是一个unsigned char
,但它在算术表达式中被提升为int
,而你的int
不是64位。 左侧的类型不会自动“感染”右侧,这不是C的工作方式。
你需要施放:
const uint64_t id = ((uint64_t) Buffer[7]) << 56;
等等。