假设x
是unsigned int
然后x << n
等于 x * 2 n
我知道签名整数是真的。
x * 15
等于到x << 4 - x
?
答案 0 :(得分:1)
这个答案是针对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
的值是2 b 的次数,如果它在返回类型的无符号版本中可表示(然后转换为signed:这使其合法将INT_MIN
创建为1 << 31
),否则行为未定义。
关于您的第二个问题,x * 15
是否等于x << 4 - x
?
答案是否定的,因为x << 4 - x
被解析为x << (4 - x)
。
如果您将表达式括起来,那么确实x * 15 == (x << 4) - x
。
但请注意,签名值不正确,因为中间结果x << 4
可能会因x
的大x * 15
的大值而溢出。