c - 在 C 中将 int 移位 32 次

标签 c bit-shift

我有一个特定的 C 位移位场景,我认为 Stack Overflow 尚未涵盖该场景。 (如果是,我还没找到!)

本练习使用 signed int 作为数据类型。

取值 0x80000000(最高有效位仅为 1。)

在机器上使用算术右移将其右移一次(我的就是这样做的)。

结果 = 0xC0000000(最左边的字节为 1100 0000)。

继续移动它,你应该从左到右填满一个。

结果 = 0xFFFFFFFF(全部。)

但是:尝试相同的示例,但一起移动一个额外的位置:

0x80000000 >> 0x00000020(右移 32 次)

你的结果?我不知道。我的结果不是全部。事实上,我得到了 0x00000001,这不是我想要的行为。为什么是这样?它是特定于机器的吗?

(上下文:作业分配将我的操作限制为几个位运算符以解决难题。这是难题的一个方面,但远非整个问题。)

最佳答案

这是未定义的行为

Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?

这意味着您应该像躲避瘟疫一样避开它。这里有一些链接,包括“每个 C 程序员都应该知道的未定义行为”:http://lwn.net/Articles/511767/

关于c - 在 C 中将 int 移位 32 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145636/

相关文章:

无法使用 Arduino Uno 使用 RF 433 MHz 发射器发送消息

c - 我以为我昨天修复了它,但我搞砸了,它仍然生成相同的随机数

c - 逆时针旋转字节数组

c - 交换字节中的位

c++ - 是否可以将三个数字插入到 2 个字节的变量中?

使用 gcc-4.9 将矢量化检查为简单示例

c - 查询服务是否正在运行

c - 如何在 C 中将 int 转换为 char *?

java - 为什么 -1 零填充右移 1=2147483647 对于 Java 中的整数?

go - Go语言中,为什么 "<<0"操作会得到1?