簡體   English   中英

為什么比較40小於等於-2147483648為真?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM