![](/img/trans.png)
[英]right shift count >= width of type or left shift count >= width of type
[英]shift count greater than width of type
我有一个函数,它需要一个int data_length
并执行以下操作:
unsigned char *message = (unsigned char*)malloc(65535 * sizeof(char));
message[2] = (unsigned char)((data_length >> 56) & 255);
我得到以下内容:
warning: right shift count >= width of type [-Wshift-count-overflow]
message[2] = (unsigned char)((data_length >> 56) & 255);
该程序可以按预期工作,但是如何删除编译器警告(不禁用它)? 类似的问题似乎没有使用变量作为要插入的数据,因此似乎解决方案是将其强制转换为int或此类。
问题很简单。 当使用data_length
进行无符号化(因为负长度几乎没有意义)时,您将其用作int
。 为了能够移位56位,该值必须至少为56 57位宽。 否则,行为是不确定的。
在实践中,已知处理器会做很多不同的事情。 在一个例子中,将32位值右移32位将清除变量。 在另一个值中,该值移位了0位( 32 % 32
!)。 然后,在某些情况下,也许处理器认为它是无效的操作码,而OS终止了该进程。
简单的解决方案:声明uint64_t data_length
。
如果你真的有自己限制在32位数据类型,那么你可以指定0到这些字节即表示最显著字节。 或者只是在转换前unsigned long long
才uint64_t
转换为uint64_t
或unsigned long long
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.