【C语言】3天速刷C语言(存储)

int——是我第一次上C语言课程时老师强行灌输给我们的头文件里面的神奇字符

#include<stdio.h>

int main()

我们美丽大方的C语言老师告诉我们,学习C语言之后,就算一行代码都不会写,也要记得把这两行代码打出来。

用小白的话说,其实int main()不是唯一的一种写法,包括我之后自己去学习的时候通常会把主函数写成void main(),为什么,因为不用返回函数,对,因为懒。

言归正题:

char、short、int、long、long long、float、double。

如果你接触过C语言,那么对这些符号绝对不会陌生,他们有一个高比格的名字——内置数据存储类型。除了内置的数据存储类型,还可以自定义,具体就是去定义要占用多少存储空间以及数据的存储形式。

简单介绍一下这些基本的内置类型:

char          //字符数据类型
short         //短整型
int             //整形  
long          //长整型
long long  //更长的整形
float          //单精度浮点数
double      //双精度浮点数
这些类型的意义和自定义类型的意义也大同小异,一是开辟内存空间的大小,二是看待内存空间的视角,也就是数据存储的形式。

计算机识别数据的形势无非就是两种,“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,以及空类型。

对于整形来说,所有数据存放内存中其实存放的都是补码。这句话是重中之重!

恭喜大家,现在已经懂得了整形数据存储的本质!

但是说到数据存储,却又绕不开大小端

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一 个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具 体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
(其实我们老师告诉我这里还存在着以前互联网行业巨头竞争的问题,大家有兴趣可以去了解一下)

接下来给大家分享一道15年百度系统工程师的笔试题,题目如下:

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
概念上文提到了,主要是给大家分享一下判断大小端的方法。
大体过程如下:
定义一个整型变量,赋值1;
将四个字节的整型变量,通过强转的方式或者联合体,将其改变成一个字节长度,判断这个字节里的数值是否为01;
如果是,则代表数据低位保存在了内存低地址中,是小端模式;否则就是大端模式。
附代码
#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

很有趣,对吧!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值