gpt4 book ai didi

c++ - 移位运算符如何影响无符号数

转载 作者:行者123 更新时间:2023-11-30 19:05:18 25 4
gpt4 key购买 nike

假设x是无符号整数

然后是x << n等于x * 2n

我知道这对于有符号整数来说是正确的。

x * 15 等于 x << 4 - x

最佳答案

这个答案是针对C语言的。对于这个特定问题,C++ 规范似乎存在细微差别。

如果x是无符号并且如果 n >= 0并且小于 x 类型中的值位数, x << n确实与乘法 x 相同2 的 n 次方。

如果此计算溢出,结果将以 x 类型的最大值为模减少。加 1。

如果x有符号,它必须是非负的,结果不能溢出,否则你将得到未定义的行为。 32 位架构上未定义行为的常见情况是:

unsigned x = 1 << 31;   /* undefined behavior: 1 is signed, 31 is too large */

正确的版本是:

unsigned x = 1U << 31;   /* correct on 32 bit architectures */

顺便说一句,从 C++14 开始,C++ 标准针对这种情况有具体规定:

a << b 的值如果它可以用返回类型的无符号版本表示(然后转换为有符号:这使得将 INT_MIN 创建为 1 << 31 是合法的),则为 a 乘以 2b ,否则行为未定义。

关于你的第二个问题,是x * 15等于 x << 4 - x

答案是否定的,因为 x << 4 - x被解析为 x << (4 - x) .

如果您将表达式括起来,那么确实 x * 15 == (x << 4) - x .

但请注意,这对于有符号值来说是不正确的,因为中间结果 x << 4 x 的大值可能会溢出其中 x * 15 的结果不会。

关于c++ - 移位运算符如何影响无符号数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50111939/

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