昨天在一个社区里,大家为C语言中int在“64位系统、32位系统”,分别占几个字节,争论不休。
本来我也不是很明确的了解这方面的知识,刚好前一阵子,拜读了《C和指针》这本书,上面在第三章明确的表示了:
K&R C 标准中并没有规定长整数一定比短整数长,但是规定一定不能比短整数短,即 long 和 short 在K&R C标准中,可以一样长。
而在ANSI标准有一个进步,出于可移植性的考虑,确定了各种整型值的最小范围
书中又进一步说明,基于标准,C语言的基本数据类型的真正的长度是由宏定义确定的。
头文件 limits.h 通过宏定义说明了char、short、int、long 变量范围的限制。
刚刚我们列数了整形值的范围,但是在浮点数当中,ANSI标准就没有太多的要求:只规定 long double 至少和 double一样长, double至少和 float一样长且所有浮点数都能容纳10^-37—10^37之间的任何值。
头文件float.h 则说明了float、double。 在这里,浮点数的取值范围表就不列了,大家有兴趣打开头文件ffloat.h看一下。
到这里我想大家一定可以明白了:基于标准,我们完全可以根据自己的意愿和优化策略更改头文件中相应的宏定义。
下面几点是值得大家注意的:
1、关于 int 的取值范围,缺省的int数值范围是由编译器设计者决定的,通常都是机器最为自然高效的位数。甚至,我们在32位的机器上,前提没有什么指令可以高效的的处理更短的整型值,我们可以将short、int、long都设置成32位。
2、浮点数在缺省的情况下 表示的是double,但是你可以在后面加上L/l或者F/f来表明其long double 或者是 float数据类型。
3、当移植问题比较重要的时候,最佳的方案就是将使用的char值限制在 unsigned char 和 signed char取值范围之间。并且只当显示的声明signed char 和unsigned char时, 才对其执行算数运算;这是考虑到char虽然在设计上是为了存储字符,但是在很多实际应用当中,尤其是嵌入式产品设计当中,本质上我们用它存储小整数,不同的编译器会将缺省的char视为unsigned或者是 signed,但是有些机器在处理signed char上得心应手,硬性将其变为unsigned,效率可能受损。所以还要有些矛盾的指出,全部显示的声明为 unsigned char 和 signed char 并不是上上之策。
4、有一个没有过多验证过的知识点 32位、64位,这个指的是寄存器的位宽。
5、这条应该放在第一位,因为我想很多人会因为第三条里矛盾、缺乏逻辑性的叙述失掉往下读的兴趣。
在32位、64位系统当中,唯一改变的是指针的长度;在32位系统当中是4个字节、64位则是8个字节。
大家如果想进一步了解学习 可以参考《C和指针》第三章。
阅读(254) | 评论(0) | 转发(0) |