左移时出现变量错误
Shift left with variable error
我试图创建一个掩码,但是当我计算shift的值并将其放在变量内时,我得到了错误的结果。看:
#include <stdio.h>
int main(){
int shift = 32 ;
printf("%dn",shift); //32
int mask = 0xFFFFFFFF << shift;
printf("%xn",mask); //ffffffff
mask = 0xFFFFFFFF << 32;
printf("%xn",mask); //00000000
return 0;
}
有人知道为什么会这样吗?
如果您的系统有32位或更小的int
,那么通过移动32位或更多会导致未定义的行为。移位的位数必须小于类型的位数
如果您有64位int,那么0xFFFFFFFF
将是一个有符号int,并且将其移动32位将1
移动到符号位,这在C中导致UB,并且在c++ 14之前的c++中。(从c++ 14开始,这会导致实现定义的行为)。
printf("%xn",mask);
也会触发UB,因为%x
需要非负值,但您将传递负的int
。为了避免这种情况,请使用unsigned int mask
。
当您触发UB时,任何事情都可能发生,包括但不限于无意义的输出,以及相同的操作给出不同的结果。
相关文章:
- 修复未初始化的局部变量错误
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 如何修复C 中向量的过载变量错误
- GUI QT全局变量错误
- 全局变量错误C
- GetFieldValue用于时间变量错误
- 变量错误:未知类型名称
- 在变量错误中浮动
- 无法使用函数变量?错误表达式必须具有类类型
- 计数器变量错误
- 初始化 cpp 文件中的私有静态成员变量.错误:成员是私有的
- 在 GetTransfer 之后,我在帐户 1 收到未分配变量错误。我无法弄清楚我搞砸了什么逻辑错误
- 变量错误的重新定义
- 在 C++ 中传递 int 变量 - 错误检查不返回值
- 未使用的变量错误,或者应该是错误
- C++外部矢量变量错误
- c模板成员变量错误
- c++中的全局变量错误LNK2020
- vc++类.静态变量错误,外部符号无法解析