【问题标题】:why can’t we use any modifiers in float data type in c为什么我们不能在 c 中的浮点数据类型中使用任何修饰符
【发布时间】:2020-03-29 05:12:12
【问题描述】:

为什么我们不能在浮点数据类型中使用任何修饰符?

#include <stdio.h> 
int main(void) 
{ 
    signed float a; 
    short float b; 
    return (0); 
} 

如果尝试使用它,编译器会给出编译时错误。

error: both ‘signed’ and ‘float’ in declaration specifiers
signed float a; 

error: both ‘short’ and ‘float’ in declaration specifiers
short float b;

为什么编译器会显示这个错误?

【问题讨论】:

  • 因为float 始终是签名的,并且具有固定的大小。
  • (注意:在独立环境(例如没有操作系统的嵌入式系统)中,大部分语言都是实现定义,你会看到一个短浮动,但理解这不是标准 C) 见 5.1.2.1 Freestanding environment
  • 学习 C 标准,例如n1570

标签: c linux gcc floating-point


【解决方案1】:

因为语言不允许。

C 中正好有三种浮点类型:floatdoublelong double。不支持无符号浮点类型或这三种以外的类型。 (实现可以提供扩展等类型。)

signedunsignedshort 不是可以任意应用的限定符。它们仅作为预定义整数类型名称语法的一部分存在。类型说明符在N1570 6.7.2 节中定义。

显然有些编译器确实支持 short float 作为 16 位浮点类型,但它是非标准的。

【讨论】:

    【解决方案2】:

    理论上听起来不错,但实际上这些东西并没有真正起作用。

    浮点数在内存中的布局方式,它们已经有一个专用的符号位,所以float本质上已经是signed float

    短浮动没有足够的空间来容纳很多有意义的信息。如果我们假设short float 有 16 位内存,那么在符号位之后,我们将几乎没有足够的位来实现一位或两位精度和高度有限的指数。

    如果内存很重要,那么您应该考虑使用定点数而不是浮点数ing-point 数。 https://en.wikipedia.org/wiki/Fixed-point_arithmetic

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2011-09-08
    • 2021-09-26
    • 2020-05-03
    • 2016-10-11
    相关资源
    最近更新 更多