目录
- 传统艺能😎
- 过渡区🤣
- 正片开始👀
- 数据类型 👏
- 内存窗口👏
- 整型的存储👏
- 原码,反码,补码👏
- 补码的意义👏
- 大小端模式
传统艺能😎
小编是大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】点我!点我!请搜索博主 【知晓天空之蓝】或扫码进入!
乔乔的gitee代码库(打灰人 )欢迎访问,点我!
(https://blog.51cto.com)感谢支持!
过渡区🤣
现在是北京时间15:30,刚刚被一道简单的题折磨了半个下午,问题出在答案的输出上,犹如困兽,心里面很恼火,觉得自己好菜好菜。天上没下雨,但心情是灰色的(逐渐网抑云)
正片开始👀
数据类型 👏
1.基本内置类型:byte,int ,char, float, double
2.构造数据类型:
数组类型;
结构体类型:struct
共用体(联合类型):union
枚举类型:enum
3.指针类型 :int* p,char* p,float* p,void* p
4.空类型 : void(无类型),通常用于函数的返回类型,函数参数与指针类型。
构造类型又叫自定义类型,在各自参数或者元素类型发生变化就会让他彻头彻尾的改变;而基本数据类型的特点就是不可以再分解为其他类型,基本类型就是自我说明,关于他们的作用就不一一赘述了。
内存窗口👏
那首先要在调试栏打开内存窗口,并搞清楚怎么观察内存,这是必要的工具
1.地址栏
2.内容
这些密密麻麻的就是内存中的数据,看到这里你可能就会疑惑,不是说内存里存的都是二进制数吗,这些是什么鬼?是的,没有错,但是内存窗口展示内容有限,在有限的范围内,他只能选择以 16 进制的形式展示出来,仅仅是展示而已。
3.文本
这个更是人不人鬼不鬼的其实是他根据内存的数据简单的以文本的格式输出其可能的内容,无价值简直就是意义不明。
整型的存储👏
不论我们在写代码时创建了个什么东西,他不会居于虚空,存在载体就会占用内存,而空间的大小是根据我们创建的数据的类型而决定的,我们要回到问题最本质的源头,在开辟的内存中到底如何去存储数据?我们不废话直接创建俩个变量看看便知
int main()
{
int a = 5;
int b = -5;
return 0;
}
内存窗口打开我们可以取地址查找 a,b 的数据存储情况:
这里是不是感觉很奇怪,二者为何差异这么大?要搞清楚我们就要继续深入研究。
原码,反码,补码👏
说整数的二进制有三种表示方法:原码,反码,补码。
整数分为正数和负数,正负数的区别就在于他们二进制32位数的最高位的 0和1代表着符号位,0为正,1为负,其余才是有效位。
正数的原反补三码合一,和他本身是一样的。但是负数就花哨了,负数原码是按照一个数的正,负直接写出来的二进制就是原码。反码在原码基础上,除开符号位进行取反得到。这里强调一下,之前讲过一个操作符:~(按位取反操作符),区别一下他俩,按位取反操作符是针对二进制数每一位全部都取反,包括符号位。补码则是反码的基础上+1得到,比如 -7 这个数的原反补分别为:
10000000 00000000 00000000 00000111 (原)
111111111 111111111 111111111 111111000(反)
111111111 111111111 111111111 111111001(补)
b 的 -5 就是 00000000 00000000 00000000 00000101以补码 11111111 11111111 11111111 11111011 每四个字节为一位化成16 进制就是 0xfffffff3。
补码的意义👏
既然内存中中存储的是二进制的补码,我们现在不谈现象谈本质,为什么偏偏要是补码呢?
我们要明白一件事就是计算机算减法是相对不容易的,因为CPU里面没有减法器,只有加法器,要算 1-1 时只能算作 1+(-1)。计算机用二进制去计算时,我们会发现,当用原码或者反码去计算根本行不通,只有补码才可以实现。
由此看来,补码的地位是绝对的老大哥,在计算机系统中,数值一律用补码来存储,主要原因是:
1.统一了零的编码
2.将符号位和其它位统一处理
3.将减法运算转变为加法运算
4.两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃
由这里看,加法和减法可以统一起来处理,此外补码和原码相互转换时,其运算过程是相同的,不需要额外的硬件电路。
大小端模式
我昨天的博客专门讲了大小端存储模式专题,其实大小端的检验也可以用今天的知识来解决:
# include<stdio.h>
int check_s()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = 0;
ret = check_s();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
其结果: