3

我注意到在 Windows 和 Linux x86 上,float 是 4 字节类型,double 是 8,但 long double 在 x86 和 x86_64 上分别是 12 和 16。C99 应该以特定的整体尺寸打破这些障碍。

最初的技术限制似乎是由于 x86 处理器无法处理超过 80 位的浮点运算(加上 2 个字节来四舍五入),但为什么与 int 类型相比标准不一致?为什么他们不去至少 80 位标准化?

4

4 回答 4

6

C 语言没有规定各种类型的实现,因此可以在尽可能广泛的硬件上高效地实现。

这也扩展到整数类型 - C 标准整数类型具有最小范围(例如,signed char是 -127 到 127,short并且int都是 -32,767 到 32,767,long是 -2,147,483,647 到 2,147,483,647,以及long long是 -9,223,372,036,854,775,807 到 9,223,752,036,8)。对于几乎所有目的,这就是程序员需要知道的全部内容。

C99 确实提供了“固定宽度”整数类型,例如int32_t- 但这些是可选的 - 如果实现不能有效地提供这种类型,则不必提供它。

对于浮点类型,有等效的限制(例如double,必须具有至少 10 个十进制数字的精度)。

于 2010-08-09T23:18:18.723 回答
3

他们试图(主要)适应预先存在的 C 实现,其中一些甚至不使用 IEEE 浮点格式。

于 2010-08-09T21:05:16.677 回答
1

ints 可用于表示抽象事物,如 id、颜色、错误代码、请求等。在这种情况下,ints 并不是真正用作整数,而是用作位集(= 容器)。大多数时候,程序员确切地知道他需要多少位,因此他希望能够使用所需的位数。

float另一方面,s 是为非常特定的用途(浮点运算)而设计的。您不太可能能够精确确定float. 实际上,大多数时候你拥有的比特越多越好。

于 2010-08-09T21:46:55.297 回答
1

C99 应该以特定的整体尺寸打破这些障碍。

不,那些固定宽度的类型是完全可选(u)intN_t的,因为并非所有处理器都使用 2 的幂的类型大小。C99 只需要和定义。这意味着与 int 类型相比标准中的不一致是完全错误的前提,因为 int 类型的大小没有一致性(u)int_fastN_t(u)int_leastN_t

许多现代 DSP 使用 24 位字来处理 24 位音频。甚至还有像Zoran ZR3800x 系列这样的 20 位 DSP或像ADAU1701这样的28 位 DSP ,它允许在没有削波的情况下转换 16/24 位音频。许多 32 位或 64 位架构还具有一些奇数大小的寄存器,以允许在不溢出的情况下累积值,例如具有40位累加器的 TI C5500 / C6000和具有 80 位累加器的SHARC 。摩托罗拉DSP5600x /3xx 系列也有奇数大小:2 字节短、3 字节整数、6 字节长。过去有很多其他字长的架构,比如 12、18、36、60 位......long使用符号幅度补码的 CPU。查看标准委员会关心的异域架构

C 旨在灵活地支持各种此类平台。指定一个固定大小,无论是整数还是浮点类型,都违背了这个目的。硬件中的浮点支持变化很大,就像整数支持一样。有不同的格式使用十进制、十六进制或其他可能的基数。每种格式都有不同大小的指数/尾数,不同的符号/指数/尾数位置,甚至有符号格式。例如,有些使用二进制补码作为尾数,而另一些使用二进制补码作为指数或整个浮点值。您可以在这里看到许多格式,但这显然不是曾经​​存在的所有格式。例如,上面的 SHARC 有一个特殊的 40 位浮点格式。一些平台还使用long double双双算术。也可以看看

这意味着您无法为所有平台标准化单一浮点格式,因为没有万能的解决方案。如果您正在设计 DSP,那么显然您需要一种最适合您的目的的格式,以便您可以尽可能多地处理数据。当 40 位格式对您的应用程序具有足够的精度、更适合缓存并且需要更小的芯片尺寸时,没有理由使用 IEEE-754 binary64。或者,如果您使用的是小型嵌入式系统,那么 80 位long double通常是无用的,因为您甚至没有足够的 ROM 用于该 80 位long double库。这就是为什么某些平台限制long double为 64 位的原因double

于 2020-11-19T15:57:02.753 回答