为什么C / C99标准的作者没有为sizeof浮点类型指定..standard?

时间:2010-08-09 20:53:08

标签: c programming-languages c99

我注意到在windows和linux x86上,float是4bytes,double是8,但long xins分别是x86和x86_64上的12和16。 C99应该用特定的整数尺寸打破这些障碍。

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

4 个答案:

答案 0 :(得分:5)

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

这也扩展到整数类型 - C标准积分类型具有最小范围(例如。signed char是-127到127,short和{{1} -32,767至32,767,int为-2,147,483,647至2,147,483,647,long为-9,223,372,036,854,775,807至9,223,372,036,854,775,807)。几乎所有目的,这都是程序员需要知道的。

C99确实提供了“固定宽度”整数类型,例如long long - 但这些是可选 - 如果实现无法有效地提供这样的类型,它就没有提供它。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

另一方面,

float是针对特定用途(浮点运算)的设计。您不太可能精确调整float所需的位数。 实际上,大部分时间你拥有的位数越多越好。

答案 3 :(得分:1)

C99应该打破具有特定整数大小的障碍。

否,those fixed-width (u)intN_t types are completely optional是因为并非所有处理器都使用2的幂的类型大小。C99仅要求定义(u)int_fastN_t(u)int_leastN_t。这意味着前提为什么与int类型相比标准中的不一致完全是错误的,因为int类型的大小没有一致性

许多现代DSP将24位字用于24位音频。甚至还有Zoran ZR3800x family28-bit DSPs之类的ADAU1701之类的20位DSP,它们允许16/24位音频的转换而不会削波。许多32位或64位体系结构还具有一些奇数大小的寄存器,以允许值的累积而不会溢出,例如TI C5500 / C600040-bit long以及SHARC和80位累加器。 Motorola DSP5600x/3xx series还具有奇数大小:2字节短,3字节整数,6字节长。过去,有许多other word sizes的体系结构,例如12、18、36、60位...以及许多CPUs that use one's complement of sign-magnitude。参见Exotic architectures the standards committees care about

C被设计为灵活,以支持各种此类平台。指定固定大小(无论是整数类型还是浮点类型)都无法达到目的。硬件中的浮点支持与整数支持一样千差万别。有使用十进制,十六进制或其他可能的底数的不同格式。每种格式都有不同的指数/尾数大小,符号/指数/尾数的不同位置,甚至有符号格式。例如,某些人的尾数使用二进制补码,而另一些人的指数或整个浮点值则使用二进制补码。您可以看到here的多种格式,但是显然并非所有格式都存在。例如,上面的SHARC具有特殊的40位浮点格式。某些平台还将long double用于double-double arithmetic。另请参见

这意味着您无法为所有平台标准化单一浮点格式,因为没有一种“放之四海而皆准”的解决方案。如果您正在设计DSP,那么显然您需要具有最适合自己目的的格式,以便可以流失尽可能多的数据。当40位格式对您的应用程序具有足够的精度,更适合高速缓存并且所需的裸片尺寸小得多时,没有理由使用IEEE-754 binary64。或者,如果您使用的是小型嵌入式系统,则80位long double通常是无用的,因为您甚至没有足够的ROM来存储该80位long double库。这就是为什么某些平台将long double限制为double之类的64位

相关问题