使用类型转换把float值存进整型变量
你认为下面这段代码将显示什么?
int x = 7;
int y = 2;
float z = x / y;
printf("z = %f\n", z);
答案是3.0000。为什么是3.0000?因为x
和y
都是整型,而两个整型相除,结果是一个舍入的整数,在这个例子中就是3。
如果希望两个整数相除的结果是浮点数,应该先把整数保存到float
变量中,但这样稍微有点麻烦,可以使用类型转换临时转换数值的类型:
- int x = 7;
- int y = 2;
- float z = (float)x / (float)y;
- printf("z = %f\n", z);
(float)
会把int
值转换为float
值,计算时就可以把变量当成浮点数来用。事实上,如果编译器发现有整数在加、减、乘、除浮点数,会自动替你完成转换,因此可以减少代码中显式类型转换的次数:
练习
下面这个程序帮助Head First餐厅的服务员更好地进行服务。代码自动计算总账,并为每笔消费收取消费税,你能填满所有空格吗?
注意:程序将使用多种数据类型,你认为这些数值应该用哪种数据类型?
练习解答
下面这个程序帮助Head First餐厅的服务员更好地进行服务。代码自动计算总账,并为每笔消费收取消费税,请填满所有空格。
注意:程序将使用多种数据类型,你认为这些数字应该用哪种数据类型?
聚焦数据类型大小
不同平台上数据类型的大小不同,那怎么知道
int
或double
占了多少字节?好在C标准库中有几个头文件提供了这些细节。下面这个程序将告诉你int
与float
的大小。
编译并运行代码,会看到这样的结果:
不同计算机上的结果很可能不同。
如果你想知道
char
、double
或long
的细节呢?也很简单,只要把INT
和FLT
替换成CHAR
(char
)、DBL
(double
)、SHRT
(short
)或LNG
(long
)即可。
这里没有蠢问题
问:为什么不同操作系统的数据类型大小不同?设成一样不是更明了?
答:为了适应硬件,C语言在不同的操作系统与处理器上使用不同的数据类型大小。
问:怎么说?
答:C语言诞生之初还是8位机的天下,但现在大部分计算机都是32位和64位的,因为C语言没有指定数据类型的具体大小,所以才能与时俱进。即使新的计算机出来,C语言还是能够很好地适应。
问:8位、64位到底是什么意思?
答:从技术上讲,计算机的位数有多种含义,它既可以代表CPU指令的长度,也可以代表CPU一次从存储器读取数据的大小。实际上,位数是计算机能够处理的数值长度。
问:这和
int
、double
的大小有什么关系?答:如果一台计算机能处理32位的数值,就会把基本数据类型(例如
int
)的大小设为32位。问:我知道
int
这样的整数是怎么工作的,但float
或double
是怎么保存的呢?计算机如何表示有小数点的数字呢?答:一言难尽,大部分计算机使用了IEEE发布的标准(http://tinyurl.com/6defkv6)。
问:我需要理解浮点数的工作原理吗?
答:不需要,大部分程序员使用
float
与double
时不会关注它们的细节。