不说别的,先列举几个C语言中经常要用到的类型
char
int
long
float
double
我们姑且只列出这几个数据类型,我们的重点不是在研究各个数据类型的长度,我们都知道char是1个字节、int和float都是4个字节,long和double是8个字节。重点的是我们要在程序中输出各种类型的长度。是的,你猜的没错,这个东西很简单,我们可以立刻写代码,所以我就先不多说,先把代码给大家贴出来。
#include //包含标准输入输出函数库
int main()
{
printf("字符型字长为%d\n",sizeof(char));
printf("整型字长为%d\n",sizeof(int));
printf("长整型字长为%d\n",sizeof(long));
printf("单精度浮点型字长为%d\n",sizeof(float));
printf("双精度浮点型字长为%d\n",sizeof(double));
}
代码如上,相信大家都可以看得懂吧,看不懂的要么咱们不是同一个行业,要不就是大学不是理科专业。接下来在linux系统之下来编译这段代码,首先在centos7执行。相关依赖的版本如下。
gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
我们将以上代码写在一个名为typesize.c的文件里面,保存后,在命令行中输入
gcc -o typesize.out typesize.c
执行完上面的命令之后会生成一个typesize.out的可执行文件,然后执行./typesize.out
会有如下输出
字符型字长为1
整型字长为4
长整型字长为8
单精度浮点型字长为4
双精度浮点型字长为8
编译、执行都没有报错,非常完美,当然从一开始到现在是没有问题的。接下来我们在ubuntu16.04的Linux发行版中执行以上的操作。
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
我们一样将代码写在一个名为typesize.c的文件里面,保存后,执行编译命令
gcc -o typesize.out typesize.c
有了第一次的成功经验,我很自信的觉得第二次肯定没有问题,然后我在终端上看到了如下信息
typesize.c:4:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("字符型字长为%d\n",sizeof(char));
^
typesize.c:5:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("整型字长为%d\n",sizeof(int));
^
typesize.c:6:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("长整型字长为%d\n",sizeof(long));
^
typesize.c:7:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("单精度浮点型字长为%d\n",sizeof(float));
^
typesize.c:8:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("双精度浮点型字长为%d\n",sizeof(double));
看到这里我感觉虽说C语言没有Java那么强大的跨平台性,但最起码我在linux中写的代码应该是可以公用的哇,居然发生了这样的事情,这时我的内心是崩溃的。崩溃了之后但我还是想不明白,于是乎我硬着头皮去看编译时候的报错,凭借我这个大学英语四级都不到的英语水平,我还是发现了端倪,说的是printf中%d期望的数据是一个int类型,但是第二个参数有long unsigned int类型,也就是无符号的长整型。再仔细回忆了一下,发现Centos7和ubuntu16.04的gcc版本不同,一个是4.8.xx另一个是5.4.xx,差了这么多版本,我想可能是gcc的版本的影响吧。
为了确认事实是否和我猜测的一样,我又去ubuntu14.04的版本上去做了同样的事情。ubuntu14.04的gcc版本是gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3),我想这下应该没问题了,敲下了相同的编译命令,但结果确实和16.04的时候一模一样。简直崩溃了。
看来centos和ubuntu也是有这么微小而又让人头疼的差异呀。