为什么十进制和十六进制整数文字处理方式不同?

时间:2016-04-11 22:07:06

标签: c++

阅读Stanley Lippman的“C ++ Primer”,我了解到默认情况下十进制整数文字是有符号的(intlonglong long的最小类型,其中文字的值适合)八进制和十六进制文字可以是有符号或无符号的(intunsigned intlongunsigned longlong longunsigned long long的最小类型文字的价值适合)。

以不同方式处理这些文字的原因是什么?

编辑:我正在尝试提供一些上下文

int main()
{
    auto dec = 4294967295;
    auto hex = 0xFFFFFFFF;
    return 0;
}

在Visual Studio中调试以下代码表明dec的类型为unsigned longhex的类型为unsigned int
这与我读过的内容相矛盾但仍然存在:两个变量代表相同的值,但属于不同的类型。那令我困惑。

1 个答案:

答案 0 :(得分:5)

C ++。2011年从C ++改变了促销规则.2003。这种变化记录在§C.2.1[diff.cpp03.lex]:

  

2.14.2
  更改:整数文字的类型
  基本原理:C99兼容性

C标准,包括C.1999和C.2011,定义了§6.4.4.1中的转换。 (C ++。2011§2.14.2基本上复制了C标准中的内容。)

  

整数常量的类型是其值可以在其中的第一个相应列表   代表。

enter image description here
  <子> larger image

C.1999基本原理给出了以下解释:

  

C90规则,十进制整数常量的默认类型为intlong或   unsigned long,取决于哪个类型足够大以保持值而不溢出,    简化了常量的使用。 C99中的选项包括intlonglong long。   C89添加了后缀Uu来指定无符号数字。 C99添加LL以指定long long

     

与十进制常量不同,八进制和十六进制常量太大而不能int s被输入为   unsigned int如果在该类型的范围内,因为 更有可能代表位   模式或面具,通常最好被视为无符号,而不是“真实”数字