#include<stdio.h>
int main(void)
{
signed int a=-1;
unsigned int b=1;
int c= a+b;
printf("%d\n",c);
return 0;
}
根据隐式类型转换规则,如果一个操作数为unsigned int
,则另一个操作数将转换为unsigned int
,结果将为二进制操作中的unsigned int
。
所以这里b
是unsigned int
,a
应该类型转换为unsigned int
。因为unsigned int总是+ ve,所以a
的值将是1.so c=1+1=2
。但输出是0
。怎么样?
答案 0 :(得分:16)
-1,当转换为无符号时,将成为该类型的最大可能值 - 例如使用32位无符号,它将是4,294,967,295。当你向它添加1时,值“环绕”为0。
答案 1 :(得分:2)
“a应该类型转换为unsigned int。因为unsigned int总是+ ve,所以a的值将是1.”
纠正“将来”,但之后不得; - )
将有符号整数转换为无符号的结果在标准6.3.1.3/2中指定:
如果新类型是无符号的,则为值 通过重复添加或转换 减去一个以上的最大值 可以在中表示的值 新类型,直到值在 新类型的范围
换句话说,负值通过将其值模数为2的幂来转换为无符号,而不是通过翻转符号。
答案 2 :(得分:-1)
现代机器大多使用two's complement表示负数。当添加两个数字时,如果它们中的任何一个是负数,它将首先转换为二进制补码表示。然后将添加这两个数字。因此,计算机通常会1 - 1
执行1 + two's complement of (-1)
。结果为0。
对于1 - 2
,它是1 + two's complement(-2)
。检查这个程序,相同的数字,不同的表示:
int main()
{
signed int a = 1;
unsigned int b = -2;
int c = a+b;
printf("%d\n%u\n", c, c);
return 0;
}
请阅读有关二的补码表示。你需要成为一名程序员。