根据MSDN (整数类型 - VC2008)的描述:
我得到了这个:
我期望 const
在Visual C++ 2008上运行以下代码:没有后缀的十进制常量的类型为int、long int或unsigned long int。能够表示该常量值的三种类型中,第一个被赋予该常量的类型。
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
printf
语句会导致未定义的行为。您不能将负值传递给%x
或%lx
。 - M.Mulong
:http://ideone.com/WGlarH,同时答案也非常好。 - Oraceunsigned long
)。这明确告诉编译器MSB不是符号位。编译器还具有表达式operator-(unsigned long) unsigned_long_literal(2147483648)
。不,这个一元运算符operator-
并不返回有符号长整型。 - MSalterssizeof(type)
。void foo(int)
和void foo(long)
是不同的函数。 - MSalters