在C99中是否有固定尺寸的浮动和双重类型?

时间:2012-09-08 16:15:00

标签: c floating-point c99

C99表示整数类型,如uint32_t,int16_t等,其中很容易看到使用的位数。很高兴知道嵌入式编程。

我没有找到浮点值的任何类似类型。有标准吗?如果没有,为什么?

3 个答案:

答案 0 :(得分:1)

我在Any guaranteed minimum sizes for types in C?

中找到了答案

引用Jed Smith(已更正为C99标准的链接):

是的,float.hlimits.h中的值取决于系统。你永远不应该假设类型的宽度,但标准确实规定了一些最小值。见C99 standard中的§6.2.5和§5.2.4.2.1。

例如,标准仅表示char应足够大以容纳执行字符集中的每个字符。它没有说它有多宽。

对于浮点情况,标准提示按照给出类型宽度的顺序:

§6.2.5.10

  

有三种真实浮动类型,指定为浮动长   双即可。 32 float 类型的值集是 double 类型的值集的子集; double 类型的值集合是 long double 类型的值集的子集。

他们隐含地定义哪个比另一个宽,但没有具体说明它们有多宽。 “子集”本身含糊不清,因为long double可以具有完全相同的double范围并满足此条款。

这是C的典型代表,并且每个环境都有很多。你不能假设,你必须问编译器。

答案 1 :(得分:1)

要回答问题的“为什么”部分,例如,名称uint32_t会告诉您需要了解的有关类型的所有信息:它是无符号的,正好是32位宽,这意味着确切的范围04294967295。 (C标准要求uintN_t类型没有填充位或陷阱表示,并且带符号的intN_t类型使用二进制补码。)

另一方面,指定浮点类型的位大小并不能告诉你几乎一样多。假设的float64_t恰好是64位,但构成浮点对象的位被分为符号位,指数和有效位数(尾数)。此外,这些位的含义可以变化。在大多数表示中,指数表示2的幂,但它也可以是16的幂。并且存在许多特殊表示:次正规,非正规,NaN,无穷,负零。

浮点表示的变化多于可以在类型名称中轻松编码的变化。

IEEE浮点标准(更恰当的是IEC 60559)定义了所有这些 - 但如果您的实现支持IEC 60559,则C标准无论如何都指定floatdouble的含义(尽管它为long double)提供了更多的灵活性。

答案 2 :(得分:0)

虽然绝大多数C编译器都包含32位整数类型,但有许多只有32位类型为int,而在其他编译器中只有32位类型为long。标准名称int32_t表示"签名的32位类型之一"避免程序员知道哪个内置类型是32位,除了使用基于类型的基于类型的别名的编译器。

相比之下,绝大多数可以使用IEEE单精度值的编译器将其称为float,而那些可以使用IEEE双精度值的编译器将其称为double。编译器可能使用名称floatdouble来识别IEEE类型之外的其他内容并且在其他名称下包含IEEE类型,这是不可想象的,但是这种情况可能太罕见了让标准担心。