无符号数的加法检测结果显示不溢出??(语言-c语言)

各为什么无符号数的加法,一方溢出一方不溢出的情况下用加法检测结果显示不溢出?

代码如下:

#include 
int uadd_ok(unsigned x,unsigned y){
    unsigned sum = x+y;
    return sum>=x; 
}

int main(){
    unsigned a = 12345678912;
    unsigned b = 12345678912;
    unsigned sum = a+b;
    printf("%u\n",sum);
    int func = uadd_ok(a,b);
    printf("%d",func);
    return 0;
} 

a和b初始化的时候就溢出了

该回答引用ChatGPT

这是因为在无符号数的加法中,当两个数相加时,如果它们的和大于等于它们的最大值,则会发生溢出,结果将被截断为它们的最小值。例如,对于一个32位无符号整数,最大值为4294967295,如果它与任何大于0的数相加,结果将溢出并截断为负数,即最小值0。

因此,当一方无符号数加法溢出而另一方没有溢出时,加法结果将大于等于任意一个原始操作数。因此,使用sum>=x来检测加法结果是否溢出,其中x是原始操作数之一。

在提供的代码示例中,当a和b都设置为12345678912时,它们的和将大于无符号32位整数的最大值,导致溢出。因此,无符号加法sum的结果将被截断为0。然而,函数uadd_ok使用sum>=x来检测结果是否溢出,其中x等于a或b,因此它将返回1表示结果没有溢出。