繁体   English   中英

右移计数> =类型宽度或左移计数> =类型宽度

[英]right shift count >= width of type or left shift count >= width of type

我是位新手,我正在尝试获取使用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);
}

它的获取错误左移计数> =类型的宽度我检查了系统是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;

等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM