#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
。如何?隐式类型转换
我相信这是您遇到的实现定义(或未定义?)行为。 – strager 2010-10-07 18:24:52
@strager:是的,赋值给'c'的行为是实现定义的。 6.3.1.3/3:“新类型被签名并且值不能在其中表示;结果是实现定义的或者实现定义的信号被引发。” – 2010-10-07 18:55:20
你们都错了。相关的转换是从有符号到无符号的,而不是无符号到有符号的,并且行为是明确的。 '-1'以模数'UINT_MAX + 1'减少,产生'UINT_MAX',并且再次加1就导致以'UINT_MAX + 1'模为模的减少,因此0.然后将0转换回有符号类型,然后明确定义。 – 2010-10-07 18:59:24