使用类型转换把float值存进整型变量

你认为下面这段代码将显示什么?

  1. int x = 7;
  2. int y = 2;
  3. float z = x / y;
  4. printf("z = %f\n", z);

答案是3.0000。为什么是3.0000?因为xy都是整型,而两个整型相除,结果是一个舍入的整数,在这个例子中就是3。

使用类型转换把float值存进整型变量 - 图1

如果希望两个整数相除的结果是浮点数,应该先把整数保存到float变量中,但这样稍微有点麻烦,可以使用类型转换临时转换数值的类型:

  1. int x = 7;
  2. int y = 2;
  3. float z = (float)x / (float)y;
  4. printf("z = %f\n", z);

(float)会把int值转换为float值,计算时就可以把变量当成浮点数来用。事实上,如果编译器发现有整数在加、减、乘、除浮点数,会自动替你完成转换,因此可以减少代码中显式类型转换的次数:

使用类型转换把float值存进整型变量 - 图2

 

使用类型转换把float值存进整型变量 - 图3

使用类型转换把float值存进整型变量 - 图4练习

下面这个程序帮助Head First餐厅的服务员更好地进行服务。代码自动计算总账,并为每笔消费收取消费税,你能填满所有空格吗?

注意:程序将使用多种数据类型,你认为这些数值应该用哪种数据类型?

使用类型转换把float值存进整型变量 - 图5

 

使用类型转换把float值存进整型变量 - 图6练习解答

下面这个程序帮助Head First餐厅的服务员更好地进行服务。代码自动计算总账,并为每笔消费收取消费税,请填满所有空格。

注意:程序将使用多种数据类型,你认为这些数字应该用哪种数据类型?

使用类型转换把float值存进整型变量 - 图7

 

使用类型转换把float值存进整型变量 - 图8聚焦数据类型大小

不同平台上数据类型的大小不同,那怎么知道intdouble占了多少字节?好在C标准库中有几个头文件提供了这些细节。下面这个程序将告诉你intfloat的大小。

使用类型转换把float值存进整型变量 - 图9

编译并运行代码,会看到这样的结果:

使用类型转换把float值存进整型变量 - 图10

不同计算机上的结果很可能不同。

如果你想知道chardoublelong的细节呢?也很简单,只要把INTFLT替换成CHARchar)、DBLdouble)、SHRTshort)或LNGlong)即可。

 

这里没有蠢问题

问:为什么不同操作系统的数据类型大小不同?设成一样不是更明了?

:为了适应硬件,C语言在不同的操作系统与处理器上使用不同的数据类型大小。

问:怎么说?

:C语言诞生之初还是8位机的天下,但现在大部分计算机都是32位和64位的,因为C语言没有指定数据类型的具体大小,所以才能与时俱进。即使新的计算机出来,C语言还是能够很好地适应。

问:8位、64位到底是什么意思?

:从技术上讲,计算机的位数有多种含义,它既可以代表CPU指令的长度,也可以代表CPU一次从存储器读取数据的大小。实际上,位数是计算机能够处理的数值长度。

问:这和intdouble的大小有什么关系?

:如果一台计算机能处理32位的数值,就会把基本数据类型(例如int)的大小设为32位。

问:我知道int这样的整数是怎么工作的,但floatdouble是怎么保存的呢?计算机如何表示有小数点的数字呢?

:一言难尽,大部分计算机使用了IEEE发布的标准(http://tinyurl.com/6defkv6)。

问:我需要理解浮点数的工作原理吗?

:不需要,大部分程序员使用floatdouble时不会关注它们的细节。