首页 > 解决方案 > 移位计数大于类型宽度

问题描述

我有一个函数,它接受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 等。

标签: ctypes

解决方案


标准不允许移动大于所讨论类型的位宽的量,这样做会调用未定义的行为

这在C 标准的第 6.5.7p3 节中详细介绍了按位移位运算符。

对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

如果该程序似乎正在运行,那是幸运的。您可以对您的程序进行不相关的更改,或者只是在另一台机器上构建它,然后事情就会突然停止工作。

如果 的大小data_length为 32 位或更小,则右移 56 位太大。您只能移动 0 - 31。


推荐阅读