gpt4 book ai didi

c++ - 了解 2^31 和 -2^31 整数提升

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:29 25 4
gpt4 key购买 nike

#include <stdio.h>

int main() {
printf("sizeof(int): %zu\n", sizeof(int));
printf("%d\n", 2147483648u > -2147483648);
printf("%d\n", ((unsigned int)2147483648u) > ((int)-2147483648));
printf("%d\n", 2147483648u != -2147483648);
printf("%d\n", ((unsigned int)2147483648u) != ((int)-2147483648));
return 0;
}

这段代码在 C 和 C++ 中的输出,在 cygwin64 和带有 gcc 5.2.0 的 rhel6.4 机器上是:

sizeof(int): 4
1
0
1
0

根据“Integer promotions”,2147483648u 将是 unsigned int 类型(即使没有 u 后缀)和 -2147483648 类型 int(像往常一样)。为什么显式转换会产生不同的结果?

根据“Usual arithmetic conversions”,本段适用:

Otherwise, the signedness is different: If the operand with the unsigned type has conversion rank greater or equal than the rank of the type of the signed operand, then the operand with the signed type is implicitly converted to the unsigned type

这意味着正确的结果好像是:

2147483648u > 2147483648u
2147483648u != 2147483648u

被执行,因为在 32 位中,有符号 -2^31 和无符号 2^31 具有相同的表示。换句话说,类型转换的结果是正确的。这是怎么回事?

我有一种感觉,不知何故,更高级别的整数提升是在没有强制转换的情况下应用的,所以我得到了例如双方的 64 位签名促销 - 但为什么呢?

两个可执行文件都编译为 64 位,这能发挥作用吗?

最佳答案

没有负整数常量。一元数只有正数 -运营商申请。

2147483648 > INT_MAX , 促进 2147483648到下一个更大的有符号整数类型(因为您没有附加 u )整数类型, - 之前已应用。


顺便说一句,这就是为什么 INT_MIN通常定义为 (-INT_MAX - 1)<limits.h> . ;-)

关于c++ - 了解 2^31 和 -2^31 整数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130890/

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