[英]Why comparison of 40 is less than or equal to -2147483648 true?
我正在使用 Visual Studio 2019 在我的 IDE 上運行以下代碼:
cout << (40 <= -2147483648) << endl;
40
和-2147483648
都在signed int
的范圍內,所以應該沒有上溢或下溢。
我預計 output 是假的。
但是,output 是真的。
為什么?
這是編譯器的非標准功能(又名“錯誤”)。
C++ 標准要求十進制文字應具有以下類型之一:
int
long int
long long int
編譯器應該使用第一種可以表示有問題的值的類型。
但是,您的編譯器使用無符號類型,這與標准相矛盾。
幸運的是,可以使用/std:c++latest
編譯器選項禁用此行為(您應該始終使用它,除非您有特定的理由不這樣做)。
請注意,Microsoft 編譯器不會使用/std:c++14
和/std:c++17
開關禁用這種非標准行為,盡管在這些版本的標准中對文字類型的要求是相同的。 只有/std:c++20
或/std:c++latest
開關有效。
如果選擇了非標准行為,並且警告級別設置為/W2
或更高,編譯器將警告您將一元減號應用於無符號值。 始終啟用編譯器警告並將其視為錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.