将 32 位整数移位 32 位
Posted
技术标签:
【中文标题】将 32 位整数移位 32 位【英文标题】:Shifting a 32 bit integer by 32 bits 【发布时间】:2013-09-18 21:51:02 【问题描述】:我正在编写一些 C 代码,我需要将 32 位 int 左移 32 位。当我使用参数 n = 0 运行此代码时,不会发生移位。
int x = 0xFFFFFFFF;
int y = x << (32 - n);
为什么这不起作用?
【问题讨论】:
超出类型的大小会导致未定义的行为,IIRC。 What's bad about shifting a 32-bit variable 32 bits?的可能重复 【参考方案1】:转移后果自负。根据标准,您要做的是未定义的行为。
C99 §6.5.7
3 - 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。
换句话说,如果您尝试将 32 位值移动超过 31 位或负数,您的结果是不确定的。
【讨论】:
【参考方案2】:根据draft of C89 (?) standard 中的3.3.7 位移运算符部分:
如果右操作数的值为负数或大于或等于提升的左操作数的位宽度,则行为未定义。
假设 int
在您正在编译代码的系统上是 32 位的,当 n
为 0 时,您正在移动 32 位。根据上面的陈述,您的代码会导致未定义的行为。
【讨论】:
以上是关于将 32 位整数移位 32 位的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何将 32 位有符号长整数转换为 7 位整数
如何使用英特尔内在函数从 8 位整数数组构建 32 位整数?