我已阅读有关二进制数的表示形式,符号幅度,1的补码,IEEE 754的浮点数,2的补码以及如何在电路中实现它们的问题,我的问题是:什么样的二进制标准?现代计算机会使用哪种表示形式?
答案 0 :(得分:2)
对于存储或网络协议,事物可以采用各种格式,具体取决于保存数据的最佳方式以及程序员认为应该如何优化。您可以找到一些古怪的格式。例如,我几个月前编写的协议使用base64编码将符号位作为最低有效位。这样,负整数不会占用过多的字节,除非它们实际上是非常大的数字,而Two's Complement会用“ -1”填充整个字段大小。出于这个原因,Google协议缓冲区会执行类似的操作,对签名数字使用“ ZigZag”编码。
对于这个问题的更直接答案是:对于日常的常规现代计算,Two的补码是迄今为止最常见的整数内部表示形式。我知道大多数计算机都具有特殊的标志和指令来容纳二进制补码算法,例如用于检测溢出的“进位”标志和用于检测结果是否设置了最高有效位的“标志”标志。
使用浮点数会变得有些棘手,尽管IEEE 754似乎最常用于计算。我的浮点算术知识已经过时,因此欢迎进行任何更正。上一次我检查时(例如10年前),现代FPU在计算期间使用“真实”精度-因为它们的寄存器为80位格式,然后在存储数据或从FPU检索结果时,将其转换为单精度或单精度。双精度(32或64位),具体取决于程序。
现代CPU上的高级现代软件还可以访问更强大的浮点运算(SIMD-单指令多数据),这些浮点运算可用于需要大量数据处理的矢量或其他复杂数学运算(图像过滤器,音频编解码器,程序生成等),但那里使用的寄存器只是普通浮点格式或整数组合的多个实例。
正如评论中指出的那样,SIMD指令如今在浮点运算中变得越来越流行。它们在性能方面要强大得多,并且如今(在PC world / x86架构中)几乎每个CPU都至少能够访问SSE2指令集(最早于2000年/奔腾4)。 )。我不认为软件会偏向于精度而不是性能,实际上任何需要高精度计算的东西都可能会使用自定义算法(例如,银行软件不使用浮点运算,因此它们不会因舍入误差而损失几分钱) -更重要的是,舍入过程中丢失或获得的任何便士在所有计算机上都是一致的。