C99表示整数类型,如uint32_t,int16_t等,其中很容易看到使用的位数。很高兴知道嵌入式编程。
我没有找到浮点值的任何类似类型。有标准吗?如果没有,为什么?
答案 0 :(得分:1)
我在Any guaranteed minimum sizes for types in C?
中找到了答案引用Jed Smith(已更正为C99标准的链接):
是的,float.h
和limits.h
中的值取决于系统。你永远不应该假设类型的宽度,但标准确实规定了一些最小值。见C99 standard中的§6.2.5和§5.2.4.2.1。
例如,标准仅表示char
应足够大以容纳执行字符集中的每个字符。它没有说它有多宽。
对于浮点情况,标准提示按照给出类型宽度的顺序:
有三种真实浮动类型,指定为浮动,双和长 双即可。 32 ) float 类型的值集是 double 类型的值集的子集; double 类型的值集合是 long double 类型的值集的子集。
他们隐含地定义哪个比另一个宽,但没有具体说明它们有多宽。 “子集”本身含糊不清,因为long double
可以具有完全相同的double
范围并满足此条款。
这是C的典型代表,并且每个环境都有很多。你不能假设,你必须问编译器。
答案 1 :(得分:1)
要回答问题的“为什么”部分,例如,名称uint32_t
会告诉您需要了解的有关类型的所有信息:它是无符号的,正好是32位宽,这意味着确切的范围0
到4294967295
。 (C标准要求uintN_t
类型没有填充位或陷阱表示,并且带符号的intN_t
类型使用二进制补码。)
另一方面,指定浮点类型的位大小并不能告诉你几乎一样多。假设的float64_t
恰好是64位,但构成浮点对象的位被分为符号位,指数和有效位数(尾数)。此外,这些位的含义可以变化。在大多数表示中,指数表示2的幂,但它也可以是16的幂。并且存在许多特殊表示:次正规,非正规,NaN,无穷,负零。
浮点表示的变化多于可以在类型名称中轻松编码的变化。
IEEE浮点标准(更恰当的是IEC 60559)定义了所有这些 - 但如果您的实现支持IEC 60559,则C标准无论如何都指定float
和double
的含义(尽管它为long double
)提供了更多的灵活性。
答案 2 :(得分:0)
虽然绝大多数C编译器都包含32位整数类型,但有许多只有32位类型为int
,而在其他编译器中只有32位类型为long
。标准名称int32_t
表示"签名的32位类型之一"避免程序员知道哪个内置类型是32位,除了使用基于类型的基于类型的别名的编译器。
相比之下,绝大多数可以使用IEEE单精度值的编译器将其称为float
,而那些可以使用IEEE双精度值的编译器将其称为double
。编译器可能使用名称float
和double
来识别IEEE类型之外的其他内容并且在其他名称下包含IEEE类型,这是不可想象的,但是这种情况可能太罕见了让标准担心。