use*_*147 5 c++ integer literals long-long c++20
由于 C++20 二进制补码表示是标准允许的唯一表示,保证范围从 -2 N-1到 +2 N-1 -1。因此,对于 64 位有符号整数类型,范围从-9'223'372'036'854'775'808到9'223'372'036'854'775'807。但是,此代码不能在 Visual Studio 上编译(也不能在 gcc 上编译)
int main()
{
long long x{-9'223'372'036'854'775'808LL};
// error C4146: unary minus operator applied to unsigned type, result still unsigned
// error C2397: conversion from 'unsigned __int64' to '__int64' requires a narrowing conversion
}
Run Code Online (Sandbox Code Playgroud)
然而,如果我用long long x{-9'223'372'036'854'775'807LL - 1}compiles替换代码就好了并x保持正确的值。我没有得到什么?
phu*_*clv 10
如果没有LL后缀,则该类型被视为符合标准的列表中的第一个类型。如果您使用LL后缀,则该值将特别具有 type long long。但是,无论哪种方式9'223'372'036'854'775'808都太大而无法放入 along long(这是最大的有符号类型),因此某些编译器允许将其作为扩展名变为unsigned long long,因此出现警告。在这种情况下, GCC 和 Clang实际上会发出警告。与许多人的看法相反,在 C 或 C++ 中没有负整数文字。-9'223'372'036'854'775'808是应用于整数的一元减号9'223'372'036'854'775'808
文字的类型
整数文字的类型是值可以适合的第一种类型,来自类型列表,这取决于使用的数字基础和整数后缀。
- 无后缀
- 十进制:
- 整数
- 长整数
- long long int (C++11 起)
- 二进制、八进制或十六进制基数:
- 整数
- 无符号整数
- 长整数
- 无符号长整数
- long long int (C++11 起)
- unsigned long long int (C++11 起)
- ...
- 后缀:ll 或 LL
- 十进制:
- long long int (C++11 起)
- 二进制、八进制或十六进制基数
- 长长整数
- unsigned long long int (C++11 起)
- ...
如果整数文字的值太大而无法适应后缀/基数组合所允许的任何类型,并且编译器支持扩展整数类型(例如
__int128),则可以为文字提供扩展整数类型——否则程序将出错-形成。
事实上,过去有很多类似的问题-2147483648也是无符号的,因为long long当时不在 C 和 C++ 标准中,最大的类型是unsigned long:
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |