根据MSDN(Integer Types - VC2008):
没有后缀的十进制常量的类型是int,long int或unsigned long int。这三种类型中的第一种 常量值可以表示为分配给的类型 恒定。
在Visual C++ 2008上运行以下代码:
void verify_type(int a){printf("int [%i/%#x]\n", a, a);}
void verify_type(unsigned int a){printf("uint [%u/%#x]\n", a, a);}
void verify_type(long a){printf("long [%li/%#lx]\n", a, a);}
void verify_type(unsigned long a){printf("ulong [%lu/%#lx]\n", a, a);}
void verify_type(long long a){printf("long long [%lli/%#llx]\n", a, a);}
void verify_type(unsigned long long a){printf("unsigned long long [%llu/%#llx]\n", a, a);}
int _tmain(int argc, _TCHAR* argv[])
{
printf("sizeof(int) %i\n", sizeof(int));
printf("sizeof(long) %i\n", sizeof(long));
printf("sizeof(long long) %i\n\n", sizeof(long long));
verify_type(-2147483647);
verify_type(-2147483648);
getchar();
return 0;
}
我明白了:
sizeof(int) 4
sizeof(long) 4
sizeof(long long) 8
int [-2147483647/0x80000001]
ulong [2147483648/0x80000000] <------ Why ulong?
我希望const -2147483648
()为 int 。为什么我得到一个ulong而不是int?
我已经编程了很长时间,直到今天我还没有注意到+或 - 不是整数常量的一部分。这一个提示解释了一切。
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
答案 0 :(得分:5)
您正在将一元-
运算符应用于整数文字2147483648
。整数文字2^31
太大而不适合32位int
。在现代C ++中,应该被视为long long
,因此您的结果令人惊讶。
我认为旧的C标准(在long long
之前)允许将long
的字面数太大而无法使用类型unsigned long
,这与您所看到的一致。我看到你在帖子顶部引用的MSDN文档重复了这一点,所以这肯定是在这里发生了什么。
答案 1 :(得分:5)
首先,-2147483648
不是整数常量,因为-
是一元运算符,不是常量的一部分(至少在该上下文中)。 2147483648
是一个整数常量,-2147483648
是涉及该常量的表达式。
由于2147483648
无法表示为int
或long int
,但可以表示为unsigned long int
,因此会获得unsigned long int
类型。将一元-
运算符应用于unsigned long int
的结果本身就是unsigned long int
。
答案 2 :(得分:5)
-2147483648
不是整数文字。它是应用于整数文字-
的一元运算符2147483648
。该字面值不适合signed int
或signed long
,因此其类型为unsigned long
。 -
运算符不会更改该类型。