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

h9a6wy2h  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(104)

此问题在此处已有答案

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

signed short ssh{-3};
unsigned short ussh{1};

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或最接近的“更大”类型,可以适应结果而不改变它的值。
请考虑您的代码相当于

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

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

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

相关问题