我的ubuntu20.04上運行著以下代碼補丁,由gcc-9編譯。
#include <iostream>
int main()
{
uint16_t a = 0xFFFF;
uint16_t b = 1;
uint16_t ret = a b。
std::cout << a b << std::endl;
std::cout << ret << std::endl;
我希望兩個結果都能溢位,但運行結果顯示,只有第二個結果溢位,第一個結果可以得到正確的結果。
是什么讓它們表現得不同。 操作的正確值也應該是uint16_t,那么為什么第一個cout可以得到正確的結果?
P.S.,當我把型別從uint16_t改為uint32_t時,它們都被溢位了。
uj5u.com熱心網友回復:
當你做a b時,運算元將經歷算術轉換,這將促進值成為int型別。
因此a b實際上是類似于static_cast<int>(a) static_cast<int>(b),其結果當然是int。
提升只發生在小于int的型別上(所以short或char)。已經是int(或更大)的值將不會被提升。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314120.html
標籤:
