c++ 在unsigned short [duplicate]中的回绕功能

h9a6wy2h  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(167)

此问题在此处已有答案

Why is unsigned short (multiply) unsigned short converted to signed int? [duplicate](6个答案)
Implicit type conversion rules in C++ operators(9个回答)
9天前关闭
每当我运行代码时:

  1. signed short ssh{-3};
  2. unsigned short ussh{1};
  3. std::cout << ussh + ssh << '\n'; // should be (65535-2+1) = 65534

字符串
我得到的输出是-2而不是65534,而同样的回绕功能可以很好地处理unsigned long和unsigned int。
unsigned short是否禁止执行wrap around,或者只是提升为int??

bis0qfac

bis0qfac1#

整数提升的规则在C++中非常清楚,两个值都将被提升为一个类型,该类型具有一个可以接受值而不进行更改的范围,在您的情况下是int
什么都没有。

wj8zmpe1

wj8zmpe12#

默认情况下,算术运算的结果将被提升为结果可以适应的类型。对于按位和整数算术运算,它是一个int或最接近的“更大”类型,可以适应结果而不改变它的值。
请考虑您的代码相当于

  1. {
  2. auto some_value = ussh + ssh; // auto should be signed and an int at least
  3. std::cout << some_value << '\n';
  4. }

字符串
你正在寻找的行为可以用这种或类似的方式表达:

  1. // For complement of 2 it can be considered ssh being
  2. // cast to unsigned short
  3. ussh += ssh;
  4. std::cout << ussh << '\n';

展开查看全部

相关问题