【发布时间】:2011-12-19 06:13:28
【问题描述】:
我能否确认以下 C 代码为 b 提供了未定义的结果:
unsigned a = 0;
int b = a - 1;
【问题讨论】:
-
我看到的结果总是-1:ideone.com/cjArRcodepad.org/xoAD6LIJ
-
@hari:原因是这样的:
a是无符号的,而-1是整数,所以-1被提升为无符号。所以我们有b = a + UINT_MAX。但是如果UINT_MAX > INT_MAX,那么这个结果不适合b的可表示范围,因此给出未定义的结果 -
@hari:C 以明确定义的方式将 int 转换为无符号:如果 int 为非负数,则无符号结果具有相同的值。如果 int 为负数,则无符号结果等于添加到
UINT_MAX + 1的 int 值。但我发现预期的结果违反直觉,所以我在这个论坛上仔细检查以确保。 -
a-b和a+(-b)不等效。当b是INT_MIN并且a是负数时,前者对于有符号整数是明确定义的。后者不是。 -
不是实现定义的。不明确的。根据 6.5 表达式:“如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。”
标签: c math int undefined unsigned