繁体   English   中英

如何在C ++中表示64位整数文字?

[英]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位整数类型的范围。 编译器需要使用更宽的有符号整数类型来表示值(如果有的话)(在intlong intlong 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整数字面解释规则(其中类型选自intlong intunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM