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