在可变参数的函数里,为什么float型要提升为Double?
char ,short的整形提升可以理解,为什么float也要提升?
求解
[解决办法]
http://topic.csdn.net/u/20091024/17/234be8ec-c3f4-44ac-b178-dee418fe8ca2.html
[解决办法]
这个我也没想清楚……
但是有一点是肯定的,一个浮点字面量不加类型后缀就是 double,可见 C/C++ 语言对于 double 有某种原因的情有独钟~~
不过有一点是非常“不和谐”的,在算术运算的时候,int 以下的整形全部要提升成 int,浮点数却不用全部转成 double,函数传参的时候 float 又要提升……
有段时间我曾经把算术运算的默认提升和函数传参的提升弄混了……
[解决办法]
[解决办法]
LZ没看看《C专家编程》吗?
是这样的:
如果传递的是一个float,函数实际接到的是double,在被调用函数的函数体内,这些值会根据函数定义时参数的声明类型自动裁剪为该类型。
至于为什么要不嫌麻烦的将它们提升为更大的类型,然后又直接把它们裁剪为原来的大小,是因为要简化编译器——所有的东西都是同一长度。如果只固定使用几种类型,将大大简化参数的传递,尤其是在非常老式的
K&R C编译器中(不能传递struct作为参数)。
[解决办法]
还有需要记住的一点就是对于那些编译器设计者来说:效率(几乎)等于一切,一切向效率看齐
[解决办法]
[解决办法]
这实际上与CPU的发展史密切相关。从486将数学协处理器整合进CPU里开始,CPU内部的所有浮点运算都是双精度的,向下兼容单精度也会自动转成双精度,float对CPU而言失去意义。而后,随着处理电路的改良,浮点运算中,除了“除法”都可以在一个时钟周期内完成,这一来,对C/C++编译器而言,编写标准数学库时就失去单独为float独立编个库的必要了。当然,float在特别场合也有存在的必要,但那需要另外的库来支持,比如嵌入式芯片/单片机,还有一个就是GPU,(double占内存比float翻倍,这个对于CPU而言可以忽略的问题,在GPU上表现特别严重,所以,GPU为float和double各设计有一套电路的)
[解决办法]
[解决办法]
[解决办法]