Linux c学习C语言

Linux C——数据类型那些事(坑)

2016-11-21  本文已影响87人  全不干工程师

不说别的,先列举几个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也是有这么微小而又让人头疼的差异呀。

上一篇下一篇

猜你喜欢

热点阅读