gpt4 book ai didi

c++ - 为什么无符号短(乘)无符号短转换为有符号整数?

转载 作者:IT老高 更新时间:2023-10-28 21:45:39 24 4
gpt4 key购买 nike

为什么unsigned short * unsigned short在C++11中会转成int

int 太小,无法处理这行代码所示的最大值。

cout << USHRT_MAX * USHRT_MAX << endl;

MinGW 4.9.2 上的溢出

-131071

因为(source)

USHRT_MAX = 65535 (2^16-1) or greater*

INT_MAX = 32767 (2^15-1) or greater*

(2^16-1)*(2^16-1) = ~2^32.


我应该预料到这个解决方案会出现什么问题吗?

unsigned u = static_cast<unsigned>(t*t);

这个程序

unsigned short t;
cout<<typeid(t).name()<<endl;
cout<<typeid(t*t).name()<<endl;

给出输出

t
i

gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
gcc version 4.8.2 (GCC)
MinGW 4.9.2

两者都有

g++ p.cpp
g++ -std=c++11 p.cpp

证明 t*t 在这些编译器上被转换为 int


有用的资源:

Signed to unsigned conversion in C - is it always safe?

Signed & unsigned integer multiplication

https://bytes.com/topic/c-sharp/answers/223883-multiplication-types-smaller-than-int-yields-int

http://www.cplusplus.com/reference/climits

http://en.cppreference.com/w/cpp/language/types


编辑:我已经在下图中展示了这个问题。

enter image description here

最佳答案

您可能想了解 implicit conversions ,尤其是关于 numeric promotions 的部分它说的地方

Prvalues of small integral types (such as char) may be converted to prvalues of larger integral types (such as int). In particular, arithmetic operators do not accept types smaller than int as arguments

上面所说的是,如果你在涉及 arithmetic operators 的表达式中使用小于 int 的内容(如 unsigned short) (当然包括乘法)然后这些值将被提升为 int.

关于c++ - 为什么无符号短(乘)无符号短转换为有符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33731158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com