6

C99 规定了整数类型,如 uint32_t、int16_t 等,很容易看到使用的位数。很高兴知道例如嵌入式编程。

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

4

3 回答 3

2

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

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

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

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

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

§6.2.5.10

共有三种真正的浮点类型,分别指定为floatdoublelong double32 ) float类型的值集是double类型的值集的子集;double类型的值集是long double类型的值集的子集。

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

这是 C 语言的典型表现,每个单独的环境都留下了很多东西。你不能假设,你必须问编译器。

于 2012-09-08T16:21:06.063 回答
1

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

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

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

IEEE 浮点标准(更确切地说是 IEC 60559)定义了所有这些——但如果您的实现支持 IEC 60559,那么 C 标准指定了floatand的含义double(尽管它为 提供了更多的灵活性long double)。

于 2012-09-10T03:43:06.843 回答
1

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

相比之下,绝大多数可以使用 IEEE 单精度值的编译器都称它为float,而那些可以使用 IEEE 双精度值的编译器则称它为double。编译器可能会使用这些名称floatdouble识别 IEEE 类型以外的其他内容,但将 IEEE 类型包含在其他名称下,这并非不可想象,但这种情况对于标准来说可能太少见而无需担心。

于 2016-12-31T20:01:27.983 回答