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

时间:2014-10-08 04:28:11

标签: c++ memory

N3797::3.9.1/1 [basic.fundamental]

  

对于 unsigned 窄字符类型,所有可能的位模式   值表示代表数字。

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

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

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

  

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

为什么我引用的要求并不代表signed char类型?

2 个答案:

答案 0 :(得分:3)

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

这些天,对于整数类型,两个补码是more or less通用的;但语言仍允许其他语言。

答案 1 :(得分:1)

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

如果您尝试读取int,表示它尚未初始化,则可触发某种陷阱/异常/错误(例如)立即关闭程序一种错误信息。每次向<{1}}写入值时,该陷阱表示都会被清除,因此读取它可以/将会起作用。

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

标准规定,对于int,不可能有这样的陷阱表示 - unsigned char的所有位必须是&#34;可见&#34; - 它们必须构成值。这意味着它们都不能隐藏;您放入unsigned char no 位模式可以形成陷阱表示(或任何类似的)。您放入unsigned char的任何位都必须只是形成一些值。

但是,任何其他类型的都可以具有陷阱表示。例如,如果你从一些其他类型中选择一些(或多或少)任意选择的8位,并将它们读作unsigned char,它们总是形成一个你可以读取的值,写入一个但是,如果您尝试将其视为任何其他类型(unsigned charsigned char等),则可以将其形成一个陷阱表示,并试图用它做任何可以给出未定义的行为。