gpt4 book ai didi

c - 无符号整数差异的意外结果

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

我很惊讶这个函数为 dif1 和 dif2 产生了不同的值

void test()
{
unsigned int x = 0, y = 1;
long long dif1 = x - y;
long long dif2 = (int)(x - y);
printf("dif = %lld %lld",dif1,dif2);
}

这是正确的行为吗?在 dif1 计算中,它首先将 32 位无符号差值提升为 64 位无符号值,然后加上符号。这是标准行为,不是由语言指定的,还是编译器错误?第二种形式是否保证产生 -1,或取决于编译器实现?我想最安全的结构是:long long dif3 = (long long)x - (long long)y;

最佳答案

如果我们假设 long longunsigned int 宽,那么第一个是肯定定义的。如果不是,则作业会给出与答案第二部分相同的问题。

long long dif1 = x - y;

无符号整数将换行,您将获得可以存储在无符号整数中的最大值。

6.2.5 p9: A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.


至于第二个

long long dif2 = (int)(x - y);

它是实现定义的:

6.3.1.3 p3: Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.

在这种情况下,unsigned int 的最大值不能在 int 中表示,并且上述规则有效。

关于c - 无符号整数差异的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985668/

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