簡體   English   中英

C ++整型常量的類型

[英]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不能表示為intlong int ,而是可表示為unsigned long int ,所以它獲取unsigned long int類型。 並應用一元的結果-運營商的unsigned long int本身就是一個unsigned long int

-2147483648不是整數文字。 它是一元運算符-應用於整數文字2147483648 該文字的值不適合signed intsigned long ,因此它的類型為unsigned long -運算符不會更改該類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM