勿以小杯盛大物
赋值时要保证值的类型与保存它的变量类型相匹配。
不同数据类型的大小不同,千万别让值的大小超过变量。
short 比 int 的空间小,int 又比 long 小。
完全可以在 int 或 long 变量中保存 short 值。因为变量有足够的空间,你的代码将正确运行:
但是反过来,比如你想在 short 变量中保存 int 值,就不行。
有时,编译器能发现你想在小变量中保存大值,然后给出一条警告,但大多数情况下编译器不会发现。这时当你运行代码,计算机无法在 short 变量中保存 100 000。计算机能装多少 0、1 就装多少,而最终保存在变量 y 中的数字已面目全非:y 的值是 = -31072
百宝箱
为什么把一个很大的数保存到 short 中会变成负数?数字以二进制保存,二进制的 100 000 看起来 像这样:x <- 0001 1000 0110 1010 0000
当计算机想把这个值保存到 short 时,发现只能保存 2 个字节,所以只保存了数字右半边:y <- 1000 0110 1010 0000
最高位是 1 的二进制有符号数会被当成负数处理,它等价于下面的十进制数:-31072
使用类型转换把 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 时不会关注它们的细节。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论