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

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

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

我找到了C中类型的任何保证最小尺寸的答案?

引用杰德史密斯(纠正了C99标准的链接):

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

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

对于浮点大小写,标准提示按类型宽度的顺序给出:

§6.2.5.10

有三种真正的 浮动 类型 ,分别为floatdoublelong double32float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集。

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

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

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

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

浮点表示的变化比在类型名称中容易编码的变化多。

IEEE浮点标准(更恰当的是IEC 60559)定义了所有这些 – 但是如果你的实现支持IEC 60559,那么C标准无论如何都指定了floatdouble的含义(尽管它允许long double灵活性)。

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

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