[英]C++ integer constant's type
根據MSDN( 整數類型 - 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
您正在將unary -
運算符應用於整數文字2147483648
。 整數文字, 2^31
太大,不適合32位int
。 在現代C ++中,它應該被視為long long
,因此您的結果令人驚訝。
我相信舊的C標准(在long long
之前)允許解釋一個文字太大而不能long
類型unsigned long
,這與你所看到的一致。 我看到你在帖子頂部引用的MSDN文檔重復了這一點,所以這肯定是在這里發生了什么。
首先, -2147483648
不是整數常量,因為-
是一元運算符,不是常量的一部分(至少在該上下文中)。 2147483648
是整型常量, -2147483648
是涉及該常量的表達式。
因為2147483648
不能表示為int
或long int
,而是可表示為unsigned long int
,所以它獲取unsigned long int
類型。 並應用一元的結果-
運營商的unsigned long int
本身就是一個unsigned long int
。
-2147483648
不是整數文字。 它是一元運算符-
應用於整數文字2147483648
。 該文字的值不適合signed int
或signed long
,因此它的類型為unsigned long
。 -
運算符不會更改該類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.