gpt4 book ai didi

c - 当 sizeof(int) == 4 时,1 << 31 在 C 中是否定义明确

转载 作者:太空狗 更新时间:2023-10-29 16:24:22 25 4
gpt4 key购买 nike

根据this questions的回答:

The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1 × 2E2, reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 × 2E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.

这似乎暗示 1 << 31未定义。

但是,如果我使用 1 << 31,GCC 不会发出警告.它确实为 1 << 32 发行了一个. link

那是什么?我误解了标准吗?GCC 有自己的解释吗?

最佳答案

编号:1 << 31如果类型 int 具有未定义的行为只有 31 个值位。

1U << 31没问题,计算结果为 0x80000000如果输入 unsigned int有 32 个值位。

在字节有 8 位的系统上,sizeof(int) == 4表示 int最多有 31 个值位,因此将 1 移动 31 位是未定义的。相反,在 CHAR_BIT > 8 的系统上, 写 1 << 31 可能没问题.

gcc如果您提高警告级别,可能会发出警告。尝试 gcc -Wall -Wextra -W -Werror . clang确实会发出具有相同选项的警告。

要解决 Michael Roy 的评论,1 << 31 评估为INT_MIN可靠地。它可能会给你的系统这个值,但标准不保证它,事实上标准将此描述为未定义的行为,所以你不仅不能依赖它,你应该避免它以避免虚假错误。优化器通常利用潜在的未定义行为来删除代码并打破程序员的假设。

例如,下面的代码可能会编译成一个简单的 return 1; :

int check_shift(int i) {
if ((1 << i) > 0)
return 1;
else
return 0;
}

Godbolt's compiler explorer 不支持任何编译器|做,但这样做不会破坏一致性。

关于c - 当 sizeof(int) == 4 时,1 << 31 在 C 中是否定义明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45268467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com