无符号窄字符类型数字表示

Unsigned narrow character type number representation

本文关键字:数字 表示 类型 字符 无符号      更新时间:2023-10-16

N3797::3.9.1/1 [basic.fundamental]表示

对于无符号窄字符类型值表示法表示数字。

这对我来说有点不清楚。我们有以下窄字符类型的范围:

unsigned char := 0 -- 255
signed char : = -128 -- 127

对于unsgined charsigned char对象,我们有从这些对象表示中的比特集到它们可以表示的整数值的one-to-one映射。标准称N3797::3.9.1/1 [basic.fundamental]

这些要求不适用于其他类型。

为什么我引用的要求对signed char类型没有发言权?

有符号类型可以使用三种表示之一:二的补码、一的补码或符号幅度。最后两个都有一个比特模式(零的否定),它不代表一个数字。

如今,二的补码对于整数类型或多或少是通用的;但这种语言仍然允许其他语言。

一些机器具有所谓的"陷阱表示"。这意味着(例如)int可以包含一个额外的比特(或多个)来表示它是否已经初始化。

如果你试图读取一个int,其中该位表示它尚未初始化,它可能会触发某种陷阱/异常/故障,(例如)会立即关闭你的程序并显示某种错误消息。每当int写入值时,陷阱表示就会被清除,因此从中读取可以/将起作用。

因此,基本上,当程序启动时,它会将所有ints初始化为这样的陷阱表示。如果您试图从未初始化的变量中读取,硬件会立即捕获它并给您一条错误消息。

标准规定,对于unsigned char,不可能有这样的陷阱表示——unsigned char的所有位都必须是"可见的"——它们必须构成值的一部分。这意味着它们都无法隐藏no放入unsigned char的位模式可以形成陷阱表示(或任何类似的表示)。您放入unsigned char中的任何位都必须简单地形成某个值。

但是,的任何其他类型都可以具有陷阱表示。例如,如果从其他类型中(或多或少)取出一些任意选择的8位,并将其作为unsigned char读取,它们将始终形成一个可以读取、写入文件等的值。但是,如果您尝试将它们作为任何其他类型(signed charunsigned int等)读取,则允许它形成陷阱表示,尝试用它做任何的事情都会产生未定义的行为。