C++ C++;整数常数';s型
根据MSDN(): 不带后缀的十进制常量的类型为int或long int或无符号长int。这三种类型中 常量的值可以表示为指定给 不变的 在上运行以下代码: 我明白了:C++ C++;整数常数';s型,c++,types,long-integer,C++,Types,Long Integer,根据MSDN(): 不带后缀的十进制常量的类型为int或long int或无符号长int。这三种类型中 常量的值可以表示为指定给 不变的 在上运行以下代码: 我明白了: sizeof(int) 4 sizeof(long) 4 sizeof(long long) 8 int [-2147483647/0x80000001] ulong [2147483648/0x80000000] <------ Why ulong? 您正在将一元-运算符应用于整数文本2147483648。整数文本
sizeof(int) 4
sizeof(long) 4
sizeof(long long) 8
int [-2147483647/0x80000001]
ulong [2147483648/0x80000000] <------ Why ulong?
您正在将一元
-
运算符应用于整数文本2147483648
。整数文本2^31
太大,无法放入32位int
。在现代C++中,它应该被当作是<代码>长的长/代码>,所以你的结果令人惊讶。
我相信旧的C标准(在
long
之前)允许解释太大的文本,而long
无法使用类型无符号long
,这与您看到的一致。我看到您在文章顶部引用的MSDN文档重复了这一点,所以这里肯定是这样的。首先,-2147483648
不是整数常量,因为-
是一元运算符,而不是常量的一部分(至少在该上下文中)2147483648
是一个整数常量,-2147483648
是一个涉及该常量的表达式
由于
2147483648
不能表示为int
或long int
,而是可以表示为无符号长int
,因此它获取类型无符号长int
。将一元-
运算符应用于无符号长整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型。它是一元运算符-
应用于整数文本2147483648
。该文本的值不适合带符号int
或带符号long
,因此它具有类型无符号long
。-
运算符不会更改该类型。这一个使我感到不舒服。这里还有不同的结果:请注意,许多printf
语句会导致未定义的行为。不能将负值传递给<代码> %x或 %LX。C中没有函数重载,所以代码不能在C中编译。这是一些C++的用法。@ Orace,您使用C++ 11来处理这些结果,但是OP使用的是2008编译器。C++之前没有C++代码>长Lo/Eng>,因此必须在编译器中运行编译器扩展。编译器扩展应该是文档化的…当表示为32位时,值2147483648和-2147483648具有完全相同的值:0b10000000000000000000
。编译器如何知道使用哪一个?C++之前没有C++ >长Lo/<代码>。我确信VS2008没有C++11。然而,MS可能已经添加了自己的int64类型作为扩展,并制定了一些处理常量的方法;然而,这与他所展示的产出是一致的。也许编译器对4294967295之前的常量使用C++03定义,然后切换到long
。或者别的什么。@MattMcNabb:IIRC,MSVC用理智的方式对待它。任何太大的文字都会导致错误。UB的一种有效且合理的形式是类型为\uu int64
的整数文本。
sizeof(int) 4
sizeof(long) 4
sizeof(long long) 8
int [-2147483647/0x80000001]
ulong [2147483648/0x80000000] <------ Why ulong?
integer-constant:
decimal-constant integer-suffix<opt>
octal-constant integer-suffix<opt>
hexadecimal-constant integer-suffix<opt>
decimal-constant:
nonzero-digit
decimal-constant digit
octal-constant:
0
octal-constant octal-digit
hexadecimal-constant:
0x hexadecimal-digit
0X hexadecimal-digit
hexadecimal-constant hexadecimal-digit
nonzero-digit: one of
1 2 3 4 5 6 7 8 9
octal-digit: one of
0 1 2 3 4 5 6 7
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
integer-suffix:
unsigned-suffix long-suffix<opt>
long-suffix unsigned-suffix<opt>
unsigned-suffix: one of
u U
long-suffix: one of
l L