草庐IT

math - 为什么计算机科学中有8个和256个如此重要的数字?

coder 2023-06-04 原文

我不太了解RAM和HDD架构,也不知道电子设备如何处理内存块,但这总是引起我的好奇心:
为什么我们选择在计算机值中的最小元素停止在8位?
我的问题可能看起来很愚蠢,因为答案很明显,但我不太确定…
是因为2^3允许它在寻址内存时完全适合吗?
电子产品是专门为存储8位数据块而设计的吗?如果是,为什么不使用更宽泛的词呢?
因为它将32、64和128分开,所以处理器字可以被赋予其中的几个字?
对于这么小的空间,256值是否方便?
你怎么认为?
我的问题有点太形而上学了,但我想确定它只是一个历史原因,而不是一个技术或数学原因。
关于这件轶事,我也在考虑ASCII标准,在这个标准中,大多数前一个字符对于像UTF-8这样的东西是无用的,我也在考虑一些更小更快的字符编码…

最佳答案

历史上,字节的大小并不总是8位的(就这点而言,计算机也不必是二进制的,但非二进制计算在实践中的作用要小得多)。正因为这个原因,IETF和ISO标准经常使用术语octet——他们不使用byte,因为他们不想假定它在不使用时意味着8位。
实际上,当字节被创建时,它被定义为1-6位的单元。历史上使用的字节大小包括7、9、36和具有可变大小字节的机器。
8是一个商业成功的混合体,它对于思考它的人们来说是一个足够方便的数字(他们会互相馈赠),毫无疑问,还有其他我完全不知道的原因。
您提到的ASCII标准假定为7位字节,并且基于早期的6位通信标准。
编辑:这可能值得一提,因为有些人坚持认为字节总是八位字节,这会把字节和字混淆起来。
八位字节是一个以8位为单位的名字(拉丁语中的8位)。如果您使用的是一台字节为8位的计算机(或更高抽象级别的编程语言),那么这很容易做到,否则您需要一些转换代码(或硬件中的覆盖)。octet的概念更多地出现在网络标准中,而不是在本地计算中,因为在体系结构中立的情况下,它允许创建可用于不同字节大小的机器之间通信的标准,因此它可用于IETF和ISO标准(顺便说一下,ISO/IEC 10646使用八位字节,其中Unicode标准使用字节表示基本内容(后一部分有一些额外的限制),这是同一标准,尽管Unicode标准详细说明了八位字节的含义,即使不同机器上的字节大小不同)。八位字节的概念之所以存在,正是因为8位字节是常见的(因此选择将它们作为此类标准的基础),而不是通用的(因此需要另一个字来避免歧义)。
从历史上看,字节是用来存储字符的大小,这反过来又是建立在实践、标准和事实上的标准之上的,这些实践、标准和事实上的标准都是从1870年的波多特开始(我不知道以前有什么,但对correc开放的)。选项)。
这反映在C和C++中,存储字节的单位称为char,其大小在标准限制H标头中定义为CHAR_BIT。不同的机器将使用5、6、7、8、9或更多的位来定义字符。当然,现在我们将字符定义为21位,并使用不同的编码将它们存储在8位、16位或32位单元中(以及非Unicode授权的方式,如其他大小的utf-7),但历史上是这样的。
在旨在使机器之间更一致而不是反映机器体系结构的语言中,byte倾向于固定在语言中,这通常意味着它在语言中定义为8位。考虑到历史上大多数机器都有8位字节,这种区别在很大程度上是没有意义的,尽管在具有不同大小字节的机器上实现这种语言的编译器、运行时等并非不可能,但也不是那么容易。
单词是指给定计算机的“自然”大小。这一点定义不太明确,因为它会影响到一些重叠的关注点,这些关注点通常是共同的,但可能不会。一台机器上的大多数寄存器都是这个大小,但有些可能不是。最大的地址大小通常是一个字,尽管可能不是这样(Z80有一个8位字节和一个1字节字,但允许一些寄存器加倍,以提供一些16位支持,包括16位寻址)。
这里我们再次看到C和C++之间的区别,其中定义了“cc>”字大小和int,以定义一个具有“长单词”概念的处理器应该存在,尽管在给定的情况下与“cc>”可能是相同的。最小值和最大值再次出现在limits.h标题中。(事实上,随着时间的推移,long可能被定义为小于自然字的大小,作为与其他地方常见的一致性的组合,减少了一组in t的内存使用,可能还有其他我不知道的问题)。
Java和.NET语言采用的方法是在所有子菜单中定义CC和cc,并在运行时(特别是抖动)处理差异。值得注意的是,即使在.NET中,指针的大小(在不安全的代码中)也会因基础单词大小的体系结构而不同,而不是语言强制的单词大小。
因此,八位字节、字节和字都非常独立,尽管八位字节==字节和字的关系是一个整数字节(和一个整数,如2、4、8等)在今天很常见。

关于math - 为什么计算机科学中有8个和256个如此重要的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3432389/

有关math - 为什么计算机科学中有8个和256个如此重要的数字?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  7. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  8. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐