对于((无符号整数)0-1)>0,返回true 我遇到了一些类似于的C++代码。 if(((unsigned int)0-1)>0) { //do something }

对于((无符号整数)0-1)>0,返回true 我遇到了一些类似于的C++代码。 if(((unsigned int)0-1)>0) { //do something },c++,if-statement,C++,If Statement,程序执行if块中的语句。出于好奇,我在c中尝试了同样的方法,同样的效果。我的理解是,如果if条件中的表达式返回bool值true,则执行if块中的语句。这意味着无符号int0-1>0必须返回true。为什么会发生这种情况?对于无符号int0-1,运算符-的操作数是无符号int0和INT1。那么结果的类型,即,将是无符号int 否则,如果无符号操作数的转换秩大于或等于有符号操作数的转换秩,则有符号操作数将转换为无符号操作数的类型 对于unsigned int,它不能是0-1,但是 无符号整数算术始

程序执行if块中的语句。出于好奇,我在c中尝试了同样的方法,同样的效果。我的理解是,如果if条件中的表达式返回bool值true,则执行if块中的语句。这意味着无符号int0-1>0必须返回true。为什么会发生这种情况?

对于无符号int0-1,运算符-的操作数是无符号int0和INT1。那么结果的类型,即,将是无符号int

否则,如果无符号操作数的转换秩大于或等于有符号操作数的转换秩,则有符号操作数将转换为无符号操作数的类型

对于unsigned int,它不能是0-1,但是

无符号整数算术始终以2n模执行 其中n是该特定整数中的位数。例如,对于无符号整数,将1添加到​0​, 从中减去一​0​ 给

这意味着ifunsigned int0-1>0等于ifUINT_MAX>0,这是真的

对于普通算术,0-1为负1,不大于零。我们这里不是在讨论普通的算术

C++和C优先规则表示,铸造优先于减法,所以未签名INT0-1相当于未签名INT0-1。换句话说,0被视为无符号整数

下一行,我们有一个无符号int,一个符号int。关于这些操作的C++和C规则是,签名值被当作它是未签名的对待。关于未签名操作的C++和C规则是执行计算模2N,其中n是通常类型的比特数,通常为int的32,但不能保证。0-1模2N是2N-1,这是一个大的正数

引用标准第4段中的[基本.基本]

声明为无符号的无符号整数应遵守算术模2n定律,其中n是该特定整数大小的值表示中的位数。46

脚注:

46这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果被减少为比结果无符号整数类型可以表示的最大值大一的数的模


当我不能不带符号的int0-1时,我得到了4294967295,所以比较似乎是有效的。如果条件是常数,那么显然作者不知道他们在做什么。没有进一步的背景,这个问题就无法回答。这可以很好地简化为iftrue,或者进一步展开为no条件语句。表达式unsigned int0-1具有unsigned int类型。所以它总是>=0,在具体情况下>0,因为=0请使用更好的强制转换技术。未签名的int0可以写成0U。@答案中有错误吗?请告诉我,我会努力改进的。我不是落选者。你已经删掉了你写的关于溢出的不正确之处。我不认为那种迂腐的错误值得投反对票。一、 也受到了向下投票的随机推动。事情发生了。
if(((unsigned int)0-1)>0)