C ++整数常量的类型

时间:2015-03-23 13:37:45

标签: c++ types long-integer

根据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

3 个答案:

答案 0 :(得分:5)

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

我认为旧的C标准(在long long之前)允许将long的字面数太大而无法使用类型unsigned long,这与您所看到的一致。我看到你在帖子顶部引用的MSDN文档重复了这一点,所以这肯定是在这里发生了什么。

答案 1 :(得分:5)

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

由于2147483648无法表示为intlong int,但可以表示为unsigned long int,因此会获得unsigned long int类型。将一元-运算符应用于unsigned long int的结果本身就是unsigned long int

答案 2 :(得分:5)

-2147483648不是整数文字。它是应用于整数文字-的一元运算符2147483648。该字面值不适合signed intsigned long,因此其类型为unsigned long-运算符不会更改该类型。