我有這樣的代碼:
#include <iostream>
using std::cout;
using std::endl;
int main() {
uint16_t a = 0;
uint16_t b = 0;
if ( a - b < 3u )
{
cout << "cacahuète" << endl;
}
return 0;
}
當我使用 g 編譯它時-Wall,我得到:
temp.cpp: In function ‘int main()’:
temp.cpp:9:13: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
9 | if ( a - b < 3u )
| ~~~~~~^~~~
如果我改寫,則不會顯示該警告if ( a - b < static_cast<uint16_t>(3u) )。
- 那么這是怎么回事呢?int 是從哪里來的?
- 這實際上會導致不正確的行為嗎?
- 有沒有更簡潔的方法讓它靜音?(或者寫一個 uint16_t 文字的不那么冗長的方式?)
uj5u.com熱心網友回復:
那么這是怎么回事呢?int 是從哪里來的?
這里正在進行整數提升。在std::uint16_t小于 的系統上,當用作(大多數二進制操作的)運算元時int,它將被提升為。int
a - b兩個運算元都被提升到,int結果int也是。您將此有符號整數壓縮3u為unsigned int. 符號不同,因為編譯器會警告您。
如果我改寫,則不會顯示該警告
if ( a - b < static_cast<uint16_t>(3u) )。
在這里,右手運算元也被提升為int。比較的雙方都有簽名,因此沒有警告。
這實際上會導致不正確的行為嗎?
if ( a - b < static_cast<uint16_t>(3u) )確實有不同的行為a - b < static_cast<uint16_t>(3u)。如果一個是正確的,那么大概另一個是不正確的。
有沒有更簡潔的方法讓它靜音?(或者寫一個 uint16_t 文字的不那么冗長的方式?)
正確的解決方案取決于您想要正確的行為。
PS您忘記包含定義的標題uint16_t。
uj5u.com熱心網友回復:
減法a - b導致uint16_t被提升為int處理時的情況a < b和結果是否定的。
您可以將其重寫為
if (a < b 3u)
假設 b 沒有接近溢位。或者只是將其與 3 進行比較,以便雙方都簽署。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472150.html
上一篇:移動“this”的語意?
