C++整型常量的类型

Art*_*tur 3 c++ types long-integer

根据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;
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

sizeof(int) 4
sizeof(long) 4
sizeof(long long) 8

int [-2147483647/0x80000001]
ulong [2147483648/0x80000000]  <------ Why ulong?
Run Code Online (Sandbox Code Playgroud)

我希望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
Run Code Online (Sandbox Code Playgroud)

小智 5

您正在将一元运算-符应用于整数文字2147483648.整数文字,2^31太大而不适合32位int.在现代C++中,它应该被视为一个long long,所以你的结果是令人惊讶的.

我相信旧的C标准(之前long long)允许解释一个文字太大而long不能有类型unsigned long,这与你所看到的一致.我看到你在帖子顶部引用的MSDN文档重复了这一点,所以这肯定是在这里发生了什么.


Sne*_*tel 5

首先,-2147483648不是整数常量,因为它-是一元运算符,不是常量的一部分(至少在该上下文中).2147483648是一个整数常量,-2147483648是一个涉及该常量的表达式.

因为2147483648它不能表示为intlong int,但可以表示为unsigned long int,它获得类型unsigned long int.将一元运算-符应用于a 的结果unsigned long int本身就是一个unsigned long int.


asc*_*ler 5

-2147483648不是整数文字.它是-应用于整数文字的一元运算符2147483648.该文字的值不适合a signed int或者signed long,因此它具有类型unsigned long.该-运营商不改变类型.