Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是与C/C+中无符号整数的减法和比较+;定义明确?_C++_C_Undefined Behavior - Fatal编程技术网

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