无符号窄字符类型数字表示
Unsigned narrow character type number representation
N3797::3.9.1/1 [basic.fundamental]
表示
对于无符号窄字符类型值表示法表示数字。
这对我来说有点不清楚。我们有以下窄字符类型的范围:
unsigned char := 0 -- 255
signed char : = -128 -- 127
对于unsgined char
和signed char
对象,我们有从这些对象表示中的比特集到它们可以表示的整数值的one-to-one
映射。标准称N3797::3.9.1/1 [basic.fundamental]
这些要求不适用于其他类型。
为什么我引用的要求对signed char
类型没有发言权?
有符号类型可以使用三种表示之一:二的补码、一的补码或符号幅度。最后两个都有一个比特模式(零的否定),它不代表一个数字。
如今,二的补码对于整数类型或多或少是通用的;但这种语言仍然允许其他语言。
一些机器具有所谓的"陷阱表示"。这意味着(例如)int
可以包含一个额外的比特(或多个)来表示它是否已经初始化。
如果你试图读取一个int
,其中该位表示它尚未初始化,它可能会触发某种陷阱/异常/故障,(例如)会立即关闭你的程序并显示某种错误消息。每当向int
写入值时,陷阱表示就会被清除,因此从中读取可以/将起作用。
因此,基本上,当程序启动时,它会将所有int
s初始化为这样的陷阱表示。如果您试图从未初始化的变量中读取,硬件会立即捕获它并给您一条错误消息。
标准规定,对于unsigned char
,不可能有这样的陷阱表示——unsigned char
的所有位都必须是"可见的"——它们必须构成值的一部分。这意味着它们都无法隐藏no放入unsigned char
的位模式可以形成陷阱表示(或任何类似的表示)。您放入unsigned char
中的任何位都必须简单地形成某个值。
但是,的任何其他类型都可以具有陷阱表示。例如,如果从其他类型中(或多或少)取出一些任意选择的8位,并将其作为unsigned char
读取,它们将始终形成一个可以读取、写入文件等的值。但是,如果您尝试将它们作为任何其他类型(signed char
、unsigned int
等)读取,则允许它形成陷阱表示,尝试用它做任何的事情都会产生未定义的行为。
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 将数字表示为两个三角形数字的总和
- 如何将uint8_t的二进制表示形式读取为数字
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 递归地将给定字符串转换为它所表示的数字
- 将两位数字转换为低内存表示的最快方法
- 使用单个数字表示多个变量
- 如何解析小数分离器为结肠的数字的字符串表示:
- 获取所有方式以两个整数的产品表示数字
- 乘以两个表示为链接列表的大数字
- 如何将一个数字(大于8个字节)从字符阵列转换为其ASCII表示
- 编译C 程序时具有逻辑错误,该程序应将任意大的数字表示为字符串
- 如何在没有循环的二进制数字表示中只计算1位
- 如何在计算器中将大数字表示为小数点后两位C++
- 非连续内部数字表示上的位移位
- 内存地址的数字表示和对齐之间的关系
- C++标准是否指定了浮点数字表示的任何内容
- 无符号窄字符类型数字表示
- 如何在浮点二进制中看到数字表示