关于整数文字的 C++ 入门段落,需要有人澄清一些要点
C++ Primer paragraph on Integer literals, need someone to clarify some points
我目前正在研究 C++ Primer(第 5 版),我正在努力弄清楚作者在这部分文字(第 2 章,第 2.1.3 节)中的意思:
... By default, decimal literals are signed whereas octal and hexadecimal literals can be either signed or unsigned types. A decimal literal has the smallest type of int, long, or long long (i.e., the first type in this list) in which the literal’s value fits. Octal and hexadecimal literals have the smallest type of int, unsigned int, long, unsigned long, long long, or unsigned long long in which the literal’s value fits. It is an error to use a literal that is too large to fit in the largest related type...
在第一句中,作者的意思是十进制文字根据C++标准进行签名,而对于八进制和十六进制文字则取决于编译器?
虽然接下来的三句话让我很困惑,所以如果有人能提供另一种解释,我们将不胜感激。
十进制(表示以 10 为底)文字是那些没有前缀的文字。作者是说这些都是有签名的。
5 // signed int (decimal)
12 // signed int (decimal)
它们也可以根据您提供的后缀进行签名或未签名。 Here's a full reference for integer literal syntax.
5 // signed int
7U // unsigned int
7UL // unsigned long
十六进制(base-8)值将以 0x
.
为前缀
0x05 // int (hex)
同样,八进制(以 8 为基数)值以 0
.
为前缀
05 // int (octal)
如果你有一个整数文字,例如十进制整数文字,编译器必须定义它的类型。例如,表达式中可以使用十进制文字,编译器需要根据其操作数的类型来确定表达式的类型。
因此对于十进制整数文字,编译器select在以下类型之间
int
long int
long long int
并选择第一个可以容纳十进制文字的类型。
它不考虑无符号整数类型,例如 unsigned int 或 unsigned 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
那样指定,那么编译器会select一个unsigned char
类型的对象
当然是虚构的过程
然而实际上,类似的算法用于十进制文字,只有编译器考虑从 int
开始的整数类型,以确定十进制文字的类型。
追加到科里的回答:
link状态下的相关图表
整数文字允许的类型
无后缀,正十进制
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
;规范的这一部分仅与没有后缀的文字相关。
我目前正在研究 C++ Primer(第 5 版),我正在努力弄清楚作者在这部分文字(第 2 章,第 2.1.3 节)中的意思:
... By default, decimal literals are signed whereas octal and hexadecimal literals can be either signed or unsigned types. A decimal literal has the smallest type of int, long, or long long (i.e., the first type in this list) in which the literal’s value fits. Octal and hexadecimal literals have the smallest type of int, unsigned int, long, unsigned long, long long, or unsigned long long in which the literal’s value fits. It is an error to use a literal that is too large to fit in the largest related type...
在第一句中,作者的意思是十进制文字根据C++标准进行签名,而对于八进制和十六进制文字则取决于编译器?
虽然接下来的三句话让我很困惑,所以如果有人能提供另一种解释,我们将不胜感激。
十进制(表示以 10 为底)文字是那些没有前缀的文字。作者是说这些都是有签名的。
5 // signed int (decimal)
12 // signed int (decimal)
它们也可以根据您提供的后缀进行签名或未签名。 Here's a full reference for integer literal syntax.
5 // signed int
7U // unsigned int
7UL // unsigned long
十六进制(base-8)值将以 0x
.
0x05 // int (hex)
同样,八进制(以 8 为基数)值以 0
.
05 // int (octal)
如果你有一个整数文字,例如十进制整数文字,编译器必须定义它的类型。例如,表达式中可以使用十进制文字,编译器需要根据其操作数的类型来确定表达式的类型。
因此对于十进制整数文字,编译器select在以下类型之间
int
long int
long long int
并选择第一个可以容纳十进制文字的类型。
它不考虑无符号整数类型,例如 unsigned int 或 unsigned 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
那样指定,那么编译器会select一个unsigned char
当然是虚构的过程
然而实际上,类似的算法用于十进制文字,只有编译器考虑从 int
开始的整数类型,以确定十进制文字的类型。
追加到科里的回答:
link状态下的相关图表
整数文字允许的类型
无后缀,正十进制
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
;规范的这一部分仅与没有后缀的文字相关。