我对这个代码的MSVC和clang之间的行为差异感到困惑:
#include <iostream>
#include <cstdint>
int main() {
int64_t wat = -2147483648;
std::cout << "0x" << std::hex << wat << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2010,2012和2013(在Windows 7上)全部显示:
0x80000000
Run Code Online (Sandbox Code Playgroud)
但是clang 503.0.40(在OSX上)显示:
0xffffffff80000000
Run Code Online (Sandbox Code Playgroud)
根据C++标准,正确的行为是什么?文字应该是零扩展还是符号扩展到64位?
我知道这int64_t wat = -2147483648LL;会在两个编译器上产生相同的结果,但我想知道没有文字后缀的正确行为.
AnT*_*AnT 13
初始化左侧的类型无关紧要.表达式-2147483648由其自身独立解释.
Literal 2147483648没有后缀,这意味着编译器将首先尝试将其解释为int值.在您的平台int上显然是一个32位类型.值2147483648超出了带符号的32位整数类型的范围.编译器是需要使用较宽的带符号整数类型来表示的值,如果有一个可用(在int,long int,long long int序列,与最后一个是正式购自C++ 11上).但是,如果没有足够宽的有符号整数类型可用,则行为未定义
在MSVC中,历史上long int具有相同的宽度int,尽管long long int在更高版本的MSVC中也支持64位.但是,即使在VS2013(支持long long int)中我也能得到
warning C4146: unary minus operator applied to unsigned type, result still unsigned
Run Code Online (Sandbox Code Playgroud)
响应你的初始化.这意味着仍然MSVC粘到过时的整数字面解释的C89/90的规则(其中,类型分别选自int,long int,unsigned long int序列).
请注意,MSVC不是正式的C++ 11编译器.所以正式地说它没有必要尝试long long int.这种类型在C++ 11之前的语言中并不正式存在.从这个角度来看,MSVC在这种情况下没有足够大的有符号整数类型,并且行为是未定义的.在未定义行为提供的自由中,使用C89/90规则进行整数字面解释是完全合理的.
你可能也看看这个(-2147483648> 0)在C++中返回true?
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |