在C标准中,long long类型左移是否属于未定义行为?
(1LL << 63)在C标准中的行为判定 1LL是有符号64位整数类型(long long),C标准规定long long的位数至少为64位。结合各版本C标准对移位运算符的规则,结论如下:
- 对于有符号整数的左移操作,所有C标准(C99、C11、C17等)均明确:若移位结果超出该有符号类型的取值范围,行为为未定义。
long long的取值范围是[-2^63, 2^63 - 1],而1LL << 63的计算结果是2^63,显然超出了该类型的最大值,因此这个操作在任意C标准中都属于未定义行为。
补充:如果使用无符号64位整数进行移位,比如1ULL << 63,则属于合法行为——无符号整数的左移是定义明确的模运算,结果2^63在unsigned long long的取值范围内(0到2^64 - 1)。
内容的提问来源于stack exchange,提问作者lol lol
相关产品推荐
相关产品推荐

