【发布时间】:2010-10-07 18:03:04
【问题描述】:
#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.soc=1+1=2。但是输出是0。怎么样?
【问题讨论】:
-
我相信这是您正在经历的实现定义(或未定义?)的行为。
-
@strager:是的,分配给
c的行为是实现定义的。 6.3.1.3/3:“新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。” -
你们都错了。相关的转换是从有符号到无符号,不是无符号到有符号,并且行为是明确定义的。
-1以UINT_MAX+1为模减少,得到UINT_MAX,再将 1 加到UINT_MAX+1以减少模,因此为 0。然后将 0 转换回有符号类型是明确定义的。 -
@R.没错,使用这些值定义了它。出于某种原因[编辑:我找到了原因 - 因为 Parixit 在评论中提供了第二个示例] 我正在考虑将无符号算术的结果存储在有符号值中的一般情况。
标签: c