既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float?
编译器会将i转换成float类型,然后比较这两个float的大小,但是float能够表示所有的int吗?为什么没有将int和float转换成double类型进行比较呢?
在整型数的演变中,当int变成unsigned时,会丢掉负数部分(有趣的是,这样的话,0u -1就是对的了)。
和C语言中的大部分机制(在C++中得到继承)一样,就硬件操作而言,常见的算术转换应该简明易懂。C语言的发明者精通他们所使用机器上的汇编语言,他们编写的C语言对他们和像他们一样编写程序的人有直接的意义,直到使用汇编语言编写(诸如UNIX内核)的程序时。
现如今,一般来说,处理器并不具有混合类型的指令系统(如float和double相加、比较int和float,诸如此类),因为如果这样做造成芯片晶圆的巨大浪费——如果你想支持更多不同的类型,你不得不实现更多的操作码。然而,在实际中,你只有实现"add int to int"、"compare float to float"和"multiply unsigned with unsigned"等功能的常见指令,这使得优先进行算术转换变得很有必要——它们是指令系统中两种类型的映射关系,它们中的大部分很有用处。
从习惯编写低级别机器代码的编程人员的角度来说,如果有了混合类型,那么在一般情况下最有可能使用的汇编指令就是那些只需要进行最少类型转换的指令。其中,有一种特殊情况就是浮点数的转换,特别是在20世纪70年代早期,当时C语言正在被开发,计算机运行速度很慢,而浮点数的计算是通过软件完成的,所以进行转换的成本很高。这拖慢了常用算术运算的转换开发——当时只有一种操作数实现了转换(这个例外就是long到unsigned int的转换,这种转换没有任何要求,在大部分机器上都可以进行。当然并不是全部,因为总有例外情况)。
所以,编写常用的算术转换是为了完成汇编程序员在大部分时间需要做的事情:即有两种不匹配的类型,将一种转换成另一种。这也就是汇编代码所做的事情,除非有特别原因需要进行其它类型转换。对于那些习惯编写汇编代码的人来说,除非是特殊需要,才会被迫去编写一种不同的类型转换。显然,这种情况下提出编写转换是很自然的事情。虽然,你可以简单地写成这样
if((double) i (double) f)
顺便提一下,在这个问题中有趣的是,unsigned的优先级高于int,所以把int和unsigned进行比较时,最终进行的是unsigned类型的比较(开头提到的0u -1就是这个道理)。我猜测这可能是在早些时候(计算机发展初期),当时的人们认为unsigned比int在所表示的数值范围上受到的限制更小:现在还不需要符号位,所以可以使用额外的位来表示更大的数值范围。如果你觉得int可能会溢出,那么就使用unsigned好了——在使用16位表示的ints时这个担心会更明显。
原文发布时间:2015-05-11
本文来自云栖合作伙伴“linux中国”
自定义C++ void swap(int& ra, int * pb)函数 这是一个软考和c++考试的一个经典面试题,给出5空,然后了,检测swap函数怎么写,主要考察的就是对于指针与引用的理解,难点为,很多人都不知道第三空填啥,因为我们通常写的c++的swap函数没有这一行,下面给出我的答案。
相关文章
- 【c++STL——第十一讲】iterator系列 (常用知识点总结)
- 下载高版本的libstdc++.so.
- [c++菜鸟]《Accelerate C++》读书笔记
- 39 C++ - 为什么不能重载&&、||
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- c++中为什么父类名可以直接调用自己的非静态函数测试例子!(父类名::非静态函数)
- 使用c++filt命令还原C++编译后的函数名
- Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布
- 《C++并发编程实战》——1.2 为什么使用并发
- 《C++ AMP:用Visual C++加速大规模并行计算》——1.1 为什么选择GPGPU?什么是异构计算?
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.8 在CPU和GPU之间复制数据
- 《C++面向对象高效编程(第2版)》——3.13 采用语义
- C++ 为什么经常用指针方式来使用对象
- 基于C+++Mysql实现(WinForm)图书管理系统【100010034】
- C++为什么抓不到除0错“异常”?
- C++:对象移动、右值引用详解
- 为什么说 C/C++ 不适合做 Web 开发?(成本高,容易出错,apache等工具分担了大部分工作)
- C++ 内存拷贝函数 memcpy
- C++ 关联容器之map插入相同键元素与查找元素操作