将 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 位的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个32位整数组合成一个64位整数?

将 32 个布尔值的集合转换为 32 位整数 [重复]

Python:如何将 32 位有符号长整数转换为 7 位整数

如何使用英特尔内在函数从 8 位整数数组构建 32 位整数?

对于所有外键,如何在 SQL 中将数据类型从 32 位整数升级到 64 位整数?

基数排序如何用于 32 位(或更高)整数排序?