我遇到了一些类似
的c ++代码if(((unsigned int)0-1)>0)
{
//do something
}
并且程序执行if块中的语句。好奇,我在c中尝试过同样的事情。我的理解是,如果if条件中的表达式返回bool值为true,则if块中的语句将被执行。这意味着((unsigned int)0-1)> 0必须返回true。为什么会这样?
答案 0 :(得分:3)
对于(unsigned int)0-1
,operator-
的操作数为unsigned int
0
和int
1
。然后结果的类型(即common type)将是unsigned int
。
否则,如果无符号操作数的转换等级大于或等于带符号操作数的转换等级,则带符号操作数将转换为无符号操作数的类型。
对于unsigned int
,它不能是0-1
,而是
始终执行无符号整数运算 modulo 2 n 其中n是该特定整数中的位数。例如。对于
unsigned int
,向UINT_MAX添加一个0
,从0
减去一个UINT_MAX。
这意味着if(((unsigned int)0-1)>0)
相当于if(UINT_MAX>0)
,即true
。
答案 1 :(得分:2)
if(((unsigned int)0-1)>0)
对于普通算术,0-1为负1,不大于零。我们这里没有处理普通算法。
C ++(以及C)优先级规则表明,转换优先于减法,因此(unsigned int)0-1
等同于((unsigned int) 0)-1
。换句话说,0
被视为unsigned int
。
接下来我们有unsigned int
减去签名的int
。关于此类操作的C ++(和C)规则是将签名值视为无符号值。关于无符号运算的C ++(和C)规则是执行模2 N 的计算,其中N是公共类型中的位数(对于int
通常为32,但不保证这一点)。 0-1
modulo 2 N 是2 N -1,这是一个(大)正数。
引用标准,[basic.fundamental]第4段,
无符号整数,声明为无符号整数,应遵守算术模2 n 的定律,其中 n 是值表示中的位数特定大小的整数。 46
和脚注:
46)这意味着无符号算术不会溢出,因为无法用结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量为模。