每个字两位的幂是否“方便”?如果是,那是为什么呢?


11

我发现有几个消息来源声称二进制字中的2的幂(例如,每字节8位)是“好事”或“便利”。我找不到任何资料指出原因。

什么是为什么字节是八位的历史?我们读了批准的答案:

二进制计算机激励设计人员将大小的幂乘以2。

好吧,为什么呢?在同一问题中,但在该问题的评论字段中,我发现:

开玩笑的最后一句话是吗?12位字节不方便,因为它不是2的幂。-robjb

再次,没有理由...

2的幂次幂,地址计算要简单得多,这要用小罐中的原始晶体管制作逻辑电路时很重要-Mike

由于字节是最小的可寻址单元,因此没有太大意义。尽管对此评论有很多支持。也许我错过了一些东西。

维基百科

8位的事实上的标准是2的方便乘方,允许1字节的值从0到255

这会很方便,因为...?

为了清楚起见,这大约是每个字节的位数(例如8或6,等等),而不是每个字节的数(例如2 8或2 6等)。由于混乱,我还指出这与Word大小无关。

我对历史原因不太感兴趣。这些已经在其他地方得到了很好的解释(请参阅链接)。


关于SO的相关问题:https : //stackoverflow.com/questions/1606827/why-is-number-of-bits-always-a-power-of-two


2
@gnat我很确定我们在这里谈论的是每个字节的位数(即8位字节中的8),而不是字节可以代表的值的数量(即8位字节中的2 ^ 8)。因此,例如,如果您有一个6位字节,则6 不是2的幂,但是,是的,一个6位字节可以表示2个值的幂。
8bittree

2
@ 8bittree我想我明白了,谢谢您的解释!(缩回的一票表决-尽管我认为如果将您的最后评论中的解释如该问题进行编辑,对读者来说会更容易,但这件事似乎很微妙)
gna

2
SO上的类似问题:stackoverflow.com/q/1606827/3723423-答案带来了一些有关便利性的合理论点
Christophe

2
@Snowman:OP的帖子中包含一个“乞讨的问题”谬论:“为什么两个的幂被认为是方便的字节大小?” 他们不是。它与2的幂无关。他误读了Wikipedia文章中的句子。
罗伯特·哈维

3
@RobertHarvey在回答“为什么字节是八位的历史是什么?” (在我的问题中也有链接)有以下句子:“二进制计算机激励设计人员将大小的幂乘以2。” 我也读错了吗?您认为这两个来源是什么意思?只是说“你做错了”并不是为我做的。
安德烈亚斯

Answers:


10

我认为8位字节没有成功,因为它们的宽度是2的幂。如果您不想单独处理位-这是现在和过去都不是一个共同的功能-拥有2的幂实际上并没有什么实际意义(只是-现在比节省时更多)一些分立的组件很重要-对硬件和软件工程师的反思和对其他方面的熟悉也很重要),我不记得在我的计算读数历史中提到过这一点(1)。一个需要小写,这意味着要比当时占主导地位的6位字符集更多。ASCII是7位的,但是ASCII纯粹是用于交换(因此被转换为内部代码以进行处理),因此

小组委员会认识到计算机制造商不太可能设计内部使用7位代码的计算机。他们更有可能使用4位,6位和8位代码。当前,在计算机之间以及在计算机与相关的输入/输出设备之间不存在超过128个单独且不同的字符互换的广泛需求。[具有8位自然帧大小但需要奇偶校验的纸带,因此一帧的有效载荷为7位,而ASCII则采用7位字符,而8位的优点中未引用2的幂](2)

对于硬件,则赢得了8位字节,因为当75%的数据为数字并以BCD(3)表示时,它允许一次在一个字节中压缩2个十进制数字。

(1)例如Blaauw和Brooks,计算机架构;MacKenzie,编码字符集,历史和发展都对该主题进行了讨论。

(3)MacKenzie引用的X3.2文档(负责ASCII的小组委员会)。

(3)麦肯齐。


1
谢谢。您的答案就在现场,并带来了参考。你有我的票。我知道,尽管您说的是真的,也无法证明。无法证明某物不存在。我想我应该真正询问那些声称“方便”的人,并检查他们的消息来源。也许这只是流言。语。
安德里亚斯(Andreas)

另一个便利因素是一个字节可以轻松地表示为两个十六进制值。将两个二进制编码的十进制(BCD)放在一个字节中通常被称为打包十进制。确实认为这很方便,因为当数据以十六进制显示时,十进制可以读作十进制。
JimmyJames

12位字节可以很容易地表示为三个十六进制值。您可以在一个12位字节中存储三个BCD编号。当然,这比两个十六进制值和两个BCD数字好得多。实际上,一个10位字节可以包含三个十进制数字。我认为这就是IEEE十进制浮点标准的工作方式。
gnasher729

1
@JimmyJames,我认为您将因果关系反转为十六进制。十六进制之所以流行,是因为它是一种表示8位字节的紧凑方式,以前是八进制的(在像PDP-11这样具有8位字节但其中3位字段很重要的机器上更受欢迎)在指令集编码中)。
AProgrammer

@ gnasher729,8位字节是60年代的孩子。从60位char变为12位char在60年代是不可想象的。即使在今天,当我们不受约束时,UTF-8仍然很受欢迎,因为UTF-16被认为太浪费了。当您使用前面板检查寄存器和内存中的值,而又不谈论当时技术对实现的影响时,10位字节几乎是不可想象的,每3个十进制数字10位的编码也完全不可行。
AProgrammer

2

除了历史事故之外,没有特殊原因可以使用8/16/32/64位。我想12/24/48/96位确实会更有用。

对于处理文本,使用假设的UTF-24的Unicode比使用UTF32便宜。假设UTF-12会将所有单字节和双字节UTF-8字符存储在12位中,并将所有三字节和四字节UTF-8字符存储在24位中(范围将略微减小为2 ^ 20个字符,但这仍然是四倍超出了慷慨使用的范围);代码将更简单,因为只有两个变体。

对于浮点数,通常48位就足够了。96位明显优于80位扩展。24位对于图形很有用;比某些图形卡支持的16位功能有用得多。48位指针可以处理256 TB。

唯一的缺点是位数组,其中需要除以12以计算字节位置。如果觉得那很重要,我敢肯定,在硬件中可以非常有效地实现12分频。


关于UTF的有趣之处在于,尽管有些偏离主题。浮点字节(或位)大小是内存和精度之间的无尽争斗,您只需要与另一者生活在一起即可。关于位数组的好一点。
安德烈亚斯

1
有趣的想法,但我不确定这是否能回答问题。

1
问题是:“为什么八位被认为方便”。当然说“不是”可以回答这个问题。
gnasher729

1
@ gnasher729问题是:“为什么每个字节两位的幂被认为是方便的”,尽管您的答案似乎也适用。
8bittree

2
评论不作进一步讨论;此对话已转移至聊天
扬尼斯,

2

由于使用8的倍数的通用硬件体系结构(例如32位和64位体系结构),因此很方便。这意味着使用8位数据存储和传输时效率更高。

“但是,出于经济性的考虑,强烈建议采用一种尺寸,或极少数尺寸乘以主要尺寸的倍数或分数(约数)。该首选尺寸成为体系结构的字长。”

Word(计算机体系结构)

另请参阅:为什么字节为八位的历史是什么?


5
我不会接受这个答案。我的问题是为什么2的幂比较方便,而不是为什么事实上的标准是8位。8位背后的历史记录提到5、6和7位是出于真正的原因,而从7到8则是出于“ me,为什么不这样做”的动机。我觉得阅读不同来源的2幂幂比对当前系统的兼容性要重要得多。(实际上,8位给出了7位字符集的奇偶校验。)Word是另一回事,在此我确实受益于2的幂数大小,即可以使用shift代替计算中的多位。
安德烈亚斯(Andreas)

3
@RobertHarvey这个问题不是关于每个开关的状态数(即二进制与三进制或更多),而是关于将多少个开关组合在一起。请参阅我对问题的编辑。
8bittree

2
对于您的编辑,每个字节的位数和每个字节的数值之间没有有意义的区别。这是表达同一件事的两种方式。字节可以容纳的值的数量直接取决于其包含的位数:一个字节有8位,因此它最多可以容纳2⁸-1
罗伯特·哈维

2
从逻辑上讲,您选择的字节大小可以容纳一个方便的数值范围。ASCII为7位,因为它提供128个不同的值,足以对罗马字母,数字字符,标点符号,控制字符和几个特殊字符的两种情况进行编码。一个字节可容纳7个ASCII位和一个奇偶校验位用于错误检查,总共8位,适合电传打字机。从那以后,我们一直在使用该大小的字节。
罗伯特·哈维

2
@JeremyKato我提到的设备较旧(大多数情况下为60-80年代),这可能就是为什么您不熟悉它们的原因。ASCII实际上是7位编码(奇偶校验不是标准的一部分)。但是,对于您的评论的主要部分,不,我没有丢失任何东西。我知道为什么使用8位特别方便是有原因的,您和罗伯特·哈维(Robert Harvey)缺少的是,问题是询问一般 2位不是8位的幂。
8bittree

1

根据Wikipedia关于word的文章,这使得与寻址内存相关的计算变得更加容易:

不同数量的内存用于存储精度不同的数据值。常用的大小通常是地址分辨率单位(字节或字)的两倍的幂。然后,将数组中某个项目的索引转换为该项目的地址,只需要移位操作即可,而无需乘法。在某些情况下,这种关系还可以避免使用除法运算。结果,大多数现代计算机设计的字大小(和其他操作数大小)是字节大小的两倍的幂。


2
是的,是一个字节大小的两倍的幂。没有固有的理由为什么一个字节应该是8位而不是9、12或15。
gnasher729

@ gnasher729,比除以9或12或15更容易除以8(或16或32或64)
。–罗伯特·布里斯托

@ gnasher729如果单词是2的幂和2个字节的幂,则意味着该字节必须是2的幂
vartec

@vartec文章和报价中写道:“常用的大小通常是地址分辨率单位(字节或字)的两倍的幂”,并且“大多数现代计算机设计的字大小(及其他操作数大小)都是幂是一个字节大小的两倍。” 我读到“字长”以字节为单位,而不是以位为单位。在文章中,没有关于位的字长为2的幂或应为2的幂的规则。
Andreas

@vartec:如果。显然,没有人会用32位字和12位字节构建机器。但是,对于具有48或96位字和12位字节的机器而言,没有任何话可说。而且有些机器的单词是十个字节。
gnasher729

0

它与地址空间紧密相关。通过向地址总线增加一位,您可以寻址两倍的存储位置。因此,当您添加额外的行时,您不妨充分利用它。

这导致1、2、4、8、16、32等自然进展。

在生产技术水平上,重复相同的光刻图案也很容易。也就是说,将其加倍。如果从一个锁存器开始,然后加倍图案,则将传递8,而不是6、10或12。


1
那和一个字节的位数有什么关系?您是否真的声称32位逻辑AND比36位或28位更容易实现?
gnasher729

1
我没有提出任何此类要求。我的建议是,由于晶体管的价格越来越便宜,IC允许使用更小的电路,因此早期的设计逐渐得到了广泛应用。
马丁·马特

1
关于生产技术水平的有趣理论。您可能正在做某事。您可以扩展该段落还是提供说明基本知识的链接?
安德烈亚斯

1
废话 例如,在各种位置都需要各种奇数位大小的图形卡中,一切都完全按照所需的大小完成,而不是多一点。如果h.264解码器的某些操作需要19位精度,那么硬件将实现19位,而不是20、24或32。请问,您不要操纵光刻图案。您定义硬件,然后通过一些创建布局的软件运行它。
gnasher729

1
@MartinMaat:您正在将营销+标准化与技术原因混淆。技术就是我们正在讨论的。
gnasher729

0

字宽并非总是2的幂。我最近已做在SHARC DSP具有用于一个32位字宽一些编码数字而不是为操作码(它是48比特宽)。

字宽为2的幂的原因可能是由于某些指令测试(或设置或清除或切换)单个位或向左或向右移动(或旋转)指定的位数。操作码中有一个位字段,用于指定单个位的位置或要移位的位数。如果字宽是2的幂,则该位字段需要log 2(word_width)位来覆盖整个字。也就是说,一个32位宽的字需要在操作码中有一个5位字段才能进行这些操作。如果该字为33位宽,则需要6位,否则无法覆盖整个字,但是如果该字为64位宽,情况也将如此。

操作码中的位非常有价值,因此它们通常不想浪费它们。然后,使该单词具有2的次幂是有意义的。

字节为8位宽的原因是它是两个可以容纳ASCII字符(7位)的最小幂。


这不是我的专业领域,但这听起来像是两个字节和字长的幂的正当理由。我想您也不必担心UB。对于一次移位,33位将需要6位操作码,但是只有大约一半的可能值(0-32)具有有用的含义。你同意吗?
Andreas

操作码必须宽于移位计数所需的位字段。一个字节就是8位的单词。计算机硬件倾向于使用8或16或32或64位的字长(并非总是这样,旧的DSP56000具有24位字)的原因是由于我上面给出的原因以及vartec给出的原因:给定打包单词的位图,并为您提供特定像素的行号和列号,您必须将列号除以字宽,才能知道要访问哪个字以测试或更改像素。除以2的幂很容易。
罗伯特·布里斯托

什么是“打包单词的位图”?HighColor是否适合该描述?
安德烈亚斯

@ robertbristow-johnson:完全缺乏想象力。在9位字节的情况下,我们将使用36位字,1.3亿种颜色而不是RGBA中的1600万种颜色,RGB666而不是RGB555或monstrosity RGB565来获得低质量的颜色,一切都会很好。ASCII将包括512个字符,最多拉丁扩展。
gnasher729

@Andreas,不,我的意思是两种“颜色”。全白或全黑。
罗伯特·布里斯托
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.