如果我将未签名的int添加到负int且算术结果是正面的,会发生什么

What happens if I add an unsigned int to a negative int and the arithmetic result is positive?

本文关键字:int 结果是 什么 如果 添加      更新时间:2023-10-16

当我要执行以下代码时,我认为签名的int我会转换为unsigned,结果将是一些很大的正数,但结果是2

int main()
{
    unsigned u = 10; int i = -8;
    std::cout << u + i << std::endl; 
    return 0;
}

执行添加时,在操作数上执行通常的算术转换,该操作数([Expr]/11.5.3):

  • 否则,如果具有无符号整数类型的操作数的等级大于或等于其他操作数的等级, 具有签名整数类型的操作数应转换为 具有无符号整数类型的操作数。

因此,-8转换为无符号号码。根据[Cons.Integral]/2的说法如下:

如果目标类型未签名,则结果值是最小的 符合源整数的未签名整数(Modulo 2 n 其中n是用于表示未签名类型的位数)。

将我们的号码转化为(MAX_UINT + 1) - 8。现在,由于未签名的添加是模块化2 n ([[BASIC.FUNDAMENTALT]/4):

未签名的整数应遵守算术模量2 n ,其中n是整数的值表示中的位数。

结果必须是 (MAX_UINT + 1) - 8 + 10 modulo MAX_UINT + 1,那只是 2