用C ++定义一个字节

时间:2010-06-30 20:28:37

标签: c++ byte

http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.6中,很明显 “另一种有效的方法是将”字节“定义为9位,并通过两个存储器字来模拟char *:第一个可以指向36位字,第二个可以是该字内的位偏移。在这种情况下,C ++编译器在使用char *指针编译代码时需要添加额外的指令。“

我无法理解“用两个词模拟char *”的含义,并进一步引用 有人可以举一个例子解释一下吗?

5 个答案:

答案 0 :(得分:3)

由于C ++规范指出char*必须指向单个字节,并且PDP-6/10不允许对单个字节中的单个字节进行寻址,因此char*存在问题(是PDP-6/10上的字节指针

因此,一个解决方法是:将一个字节定义为9位,然后在一个字(4 * 9 = 36 bits = 1 word)中基本上有4个字节。

您仍然无法char*指向PDP-6/10上的单个字节,因此char*由2个36位字组成。低位字是实际地址,高位字是一些字节掩码魔术,C ++编译器可以用来指向低位字中的右9位。

在这种情况下,

sizeof(*int)(36位)与sizeof(*char)(72位)不同。

这只是一个人为的例子,它展示了规范如何不限制特定位/字节大小。

答案 1 :(得分:3)

我认为这就是他们所描述的:

第二段中引用的PDP-10有36位字,无法解决这些字内的任何内容。以下文本描述了在符合C ++语言规范(包含在第一段中)的限制内可以解决此问题的一种方法。

假设您想要生成9位长的字节(由于某种原因)。根据规范,char* 必须能够处理单个字节。 PDP-10无法做到这一点,因为它无法处理小于36位字的任何内容。

围绕PDP-10限制的一种方法是使用两个字的内存模拟一个char*。第一个字是指向包含char的36位字的指针(这通常与PDP-10的指针允许的一样精确)。第二个字表示该字内的偏移量(以位为单位)。现在,char*可以访问系统中的任何字节,并符合C ++规范的限制。

ASCII-art视觉辅助:

| Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 |
-------------------------------------------------------------------------
|               Word 1              |               Word 2              |
|              (Address)            |              (Offset)             |
-------------------------------------------------------------------------

假设您有char* word1 = 0x0100word2 = 0x12。这将指向第256个字存储器的第18位(第三个字节的开始)。

如果这种技术真的用于在PDP-10上生成一致的C ++实现,那么C ++编译器就必须做一些额外的工作来处理这个相当时髦的内部格式所需的额外位。

该文章的重点是说明char并不总是8位。 至少 8位,但没有定义的最大值。数据类型的内部表示取决于平台体系结构,可能与您期望的不同。

答案 2 :(得分:1)

data: [char1|char2|char3|char4]

访问char1:

ptrToChar = &data
index = 0

访问char2:

ptrToChar = &data
index = 9

访问char3:

ptrToChar = &data
index = 18

...

然后访问一个char,你会:

(*ptrToChar >> index) & 0x001ff

但是ptrToChar和index将保存在编译器创建的某种结构中,以便它们相互关联。

答案 3 :(得分:0)

假设PDP-10实现希望尽可能接近8位字节。分割36位字(机器装配语言可以解决的最小内存单位)最合理的是将字分成四个9位字节。要访问特定的9位字节,您需要知道它所在的字(您使用机器的本机寻址模式,使用占用一个字的指针),并且您需要额外的数据来指示哪个单词中的4个字节是你感兴趣的。这些额外数据将存储在第二个机器字中。编译器会使用存储在第二个字中的额外数据,生成许多额外的指令来使用额外的数据从字中拉出正确的字节。

答案 4 :(得分:0)

实际上,PDP-10 可以使用单个字指针来寻址(加载,存储)小于(36位)字的“字节”。在-10时,字节指针包括包含“字节”的字地址,“字节”的宽度(以位为单位)和字中“字节”的位置(以位为右边)。递增指针(使用显式递增或递增和加载/存放指令),递增位置部分(按大小部分),并处理到下一个字地址的溢出。 (不过,请勿递减。)字节指针可以例如可以处理单个位,但是6、8、9、18(!)可能很常见,因为字节指针(全局字节指针)的特殊格式版本使它们的使用更加容易。