C++ 关于整数文字的入门段落,需要有人澄清一些要点

C++ Primer paragraph on Integer literals, need someone to clarify some points

本文关键字:段落 于整数 整数 文字 C++      更新时间:2023-10-16

我目前正在阅读C++入门(第 5 版(,我正在努力弄清楚作者在关于文字的这一部分中的意思(第 2 章,第 2.1.3 节(:

。默认情况下,十进制文本是有符号的,而八进制和十六进制文本可以是有符号或无符号类型。十进制文本具有文本值适合的最小整数、长整型或长整型(即此列表中的第一种类型(。八进制和十六进制文本具有文本值适合的最小类型的 int、无符号 int、long、无符号 long、long long 或无符号 long long。使用太大而无法容纳最大相关类型的文本是错误的......

在第一句话中,作者的意思是十进制文字是根据C++标准进行签名,而对于八进制和十六进制文字,这取决于编译器?

接下来的三句话确实让我感到困惑,所以如果有人能提供另一种解释,将不胜感激。

如果你有一个整数文本,例如十进制整数文本,编译器必须定义其类型。例如,可以在表达式中使用十进制文本,编译器需要根据表达式的操作数类型确定表达式的类型。

因此,对于十进制整数文本,编译器在以下类型之间进行选择

int
long int
long long int

并选择可以容纳十进制文本的第一种类型。

它不考虑无符号整数类型,例如无符号整数或无符号长整型,尽管它们可以容纳给定的文本。

当编译器处理八进制或十六进制整数文本时,情况会有所不同。在这种情况下,它按给定顺序考虑以下类型

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

更清楚的是,考虑一个人工的例子来证明这个想法。假设您的值等于 127 。此值可以存储在类型 signed char 中。那么价值128呢? 它不能存储在 signed char 类型的对象中,因为可以存储在类型 signed char 的对象中的最大正值是 127。

怎么办?我们可以将128存储在 unsigned char 类型的对象中,因为它的最大值是 255 .但是,编译器更喜欢将其存储在类型为 signed short 的对象中。

但是,如果像0x80这样指定此值,则编译器将选择类型为 unsigned char

的对象

这当然是一个想象的过程。

然而,在现实中,类似的算法用于十进制文字,只有编译器会考虑从int开始的整数类型来确定十进制文字的类型。

进制(意思是基数为 10(文本是那些没有前缀的文本。作者说这些总是签名的。

5      // signed int (decimal)
12     // signed int (decimal)

也可以根据您提供的后缀对其进行签名或未签名。下面是整数文本语法的完整参考。

5      // signed int
7U     // unsigned int
7UL    // unsigned long

十六进制(以 8 为基数(值将以 0x 为前缀。

0x05   // int (hex)

同样,八进制(以 8 为基数(的值也以 0 为前缀。

05     // int (octal)

附加到 Cory 的答案:

链接状态中的相关图表

整数文本允许的类型

无后缀,正则十进制

int, long int, long long int(since C++11)

所以十进制数

78625723

由有符号类型表示。

没有后缀十六进制或八进制

int, long int, 
unsigned int, unsigned long int
long long int(since C++11)
unsigned long long int(since C++11) 

所以 0x 十六进制数

0x78625723

可能由有符号或无符号值表示。

当您的文字值太大而无法容纳在有符号类型中,但确实适合相应的无符号类型时,与此相关。 例如,在具有 16 位 int 和 32 位long(现在很少见,但规范允许的最小值(的机器上,常量文字0xffff将是一个unsigned int,而文字65535(相同的值(将是一个long

当然,您可以使用U后缀强制后者成为unsigned;规范的这一部分仅与没有后缀的文本相关。