[英]C++: Difference of two unsigned 64-bit integer in a signed 64-bit integer
[英]How should a 64-bit integer literal be represented in C++?
我对这个代码的MSVC和clang之间的行为差异感到困惑:
#include <iostream>
#include <cstdint>
int main() {
int64_t wat = -2147483648;
std::cout << "0x" << std::hex << wat << std::endl;
return 0;
}
Visual Studio 2010,2012和2013(在Windows 7上)全部显示:
0x80000000
但是clang 503.0.40(在OSX上)显示:
0xffffffff80000000
根据C ++标准,正确的行为是什么? 文字应该是零扩展还是符号扩展到64位?
我知道int64_t wat = -2147483648LL;
将在两个编译器上产生相同的结果,但我想知道没有文字后缀的正确行为。
初始化左侧的类型无关紧要。 表达式-2147483648
独立地由其自身解释。
Literal 2147483648
没有后缀,这意味着编译器将首先尝试将其解释为int
值。 在您的平台上, int
显然是32位类型。 值2147483648
超出了带符号的32位整数类型的范围。 编译器需要使用更宽的有符号整数类型来表示值(如果有的话)(在int
, long int
, long long int
序列中,最后一个可以从C ++ 11正式获得)。 但是,如果没有足够宽的有符号整数类型可用,则行为未定义
在历史上MSVC long int
具有相同的宽度, int
,尽管64位long long int
也支持MSVC的更高版本。 但是,即使在VS2013(支持long long int
)中,我也能得到
warning C4146: unary minus operator applied to unsigned type, result still unsigned
响应你的初始化。 这意味着MSVC仍然坚持使用陈旧的C89 / 90整数字面解释规则(其中类型选自int
, long int
, unsigned long int
sequence)。
请注意,MSVC不是正式的C ++ 11编译器。 所以正式地说它不必尝试long long int
。 这种类型在C ++ 11之前的语言中并不正式存在。 从这个角度来看,MSVC在这种情况下没有足够大的有符号整数类型,并且行为是未定义的。 在未定义行为提供的自由中,使用C89 / 90规则进行整数字面解释是完全合理的。
你可能也看看这个(-2147483648> 0)在C ++中返回true?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.