C++ 是与C/C+中无符号整数的减法和比较+;定义明确?
作为问题的扩展,我对以下行为感到困惑C++ 是与C/C+中无符号整数的减法和比较+;定义明确?,c++,c,undefined-behavior,C++,C,Undefined Behavior,作为问题的扩展,我对以下行为感到困惑 #include <stdio.h> #include <stdint.h> int main() { uint16_t A = 50; uint16_t B = 100; uint16_t D = A - B; // D = 65486
#include <stdio.h>
#include <stdint.h>
int main() {
uint16_t A = 50;
uint16_t B = 100;
uint16_t D = A - B; // D = 65486
printf("D = %u\n", D);
int R = D > 4000; // R = 1 (true)
printf("R = %d\n", R);
int S = A - B > 4000; // S = 0 (false)
printf("S = %d\n", S);
return 0;
}
在下面的代码中,请注意A=50
和B=100
存储为无符号16位整数,减法A-B=-50=65486(mod 2^16-1)
。如果我将减法的结果存储在D
(一个无符号16位整数)中,然后计算D>4000
,我得到true
,因为65486>4000。
这很有意义
如果我放弃存储A-B
并直接计算A-B>4000
,我会得到false。这似乎不一致。这是预期的结果吗?为什么?这永远是正确的行为,还是我在“未定义的行为”的土地上
这对我来说似乎是正确的
更新:似乎最详细的答案是uint16\u t
被提升为int
(int
在我的系统中是32位的),因此a-B>4000
是通过有符号算术完成的。然而,当我切换到uint32\u t
时,不会执行任何提升(已经是32位宽),因此A-B>4000
使用无符号算术完成。这就是原因
另外,我知道人们想成为第一个回答的人,但仅仅说“整数促销”并不是一个有用的答案
如果我放弃存储A-B并直接计算A-B>4000,我会得到false。这似乎不一致
是的,从粗略的看是这样的
但是,当计算表达式A-B
时,在执行减法之前,这两个表达式都被提升为int
。因此,A-B>5000
的计算结果为false
你可以在上阅读“常用算术转换”
Re。但是当我切换到
unit32\u t
时会怎样呢
当两个操作数都是
unit32\u t
类型时,在sizeof(int)
为4而不是int
整数提升的平台上,结果也是unit32\u t
类型。哪个整数提升?如果A和B提升为32个无符号整数,则A-B>4000应该为真。如果它们被提升为有符号整数,则更有意义。具体是什么促销活动?请参阅和。这取决于:您的系统是32位还是16位?您将得到不同的答案。如果int/unsigned
==16,uint32\u t
未升级-保留uint32\u t
。如果int/unsigned
==32,uint32\u t
将升级为unsigned
。如果int/unsigned
==64,uint32\u t
将被提升为int
。但是当我切换到unit32\u t
时会怎么样?那我也该装假了!
D = 4294967246
R = 1
S = 1