int——是我第一次上C语言课程时老师强行灌输给我们的头文件里面的神奇字符
#include<stdio.h>
int main()
我们美丽大方的C语言老师告诉我们,学习C语言之后,就算一行代码都不会写,也要记得把这两行代码打出来。
用小白的话说,其实int main()不是唯一的一种写法,包括我之后自己去学习的时候通常会把主函数写成void main(),为什么,因为不用返回函数,对,因为懒。
言归正题:
char、short、int、long、long long、float、double。
如果你接触过C语言,那么对这些符号绝对不会陌生,他们有一个高比格的名字——内置数据存储类型。除了内置的数据存储类型,还可以自定义,具体就是去定义要占用多少存储空间以及数据的存储形式。
简单介绍一下这些基本的内置类型:
计算机识别数据的形势无非就是两种,“0”和“1”。把所有的一切不管是文字数字或者其他各种信息进行编码,再有计算机识别交互再译码,这其实就是我理解的电子信息技术的本质,不管是计算机或者数字电子技术都离不开010101这种简单的编码。
而不管什么类型的数据存储,呈现于计算机内部的也都是“0”和“1”罢了,有的时候透过那些华丽的外表去看本质,其实这个世界上也就这两种选择,对或错,是或否,要或不要,好或不好,“0”或“1”。
包括这些基本类型,数据存储可以通过归类来区分:
整形:char;unsigned char;signed char;short;unsigned short;signed short;以及int、long、long long和他们的无符号、有符号类型。
浮点型:float、double。
构造类型:数据类型、结构体类型(struct)、枚举类型(enum)和联合类型(union)。
当然也包括C语言的灵魂指针类型:int *p;char *pc;float* pt;void* pv,以及空类型。
对于整形来说,所有数据存放内存中其实存放的都是补码。这句话是重中之重!
恭喜大家,现在已经懂得了整形数据存储的本质!
但是说到数据存储,却又绕不开大小端。
接下来给大家分享一道15年百度系统工程师的笔试题,题目如下:
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char *)&i);\\强转
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0; }
整型介绍大概就是这些,接下来介绍一下浮点型的存储方式,我觉得很有趣。
浮点型家族包括:float、double、long double
根据国际标准IEEE 754规定,任意一个二级制浮点数v可以表述成以下形式:
(-1)^S*M*2^E
(-1)^S表示符号位,很好理解,S=1,0时分别代表-与+;
M表示有效数字,大于一小于二;
2^E表示进位。
举例来说:12.125
转化成二级制:1100.001
可以表示成:(-1)^0*1.100001*2^3,这样是不是就符合(-1)^S*M*2^E的形式了。
对于32位的浮点数,通常用1 8 23的方式存储,S占用1bit、E占用8bit、M占用23bit。
64位则是1 11 52。
S的存储方式就是正常的0/1;
E的存储方式比较复杂,简单来说,如果E不全为0或1,则存储方式要在E的基础上加上127(32位)或者1023(64位);
E全为0,代表v无限接近0;E全为1,代表v无穷大;
M则可以省略小数前面的“1.”只保留小数部分。
还是同样的例子:12.125
在存储空间里的样子就是:0 1000 0010 0000 0000 0000 0000 0100 001
很有趣,对吧!