资讯专栏INFORMATION COLUMN

C语言中数据的存储

LeanCloud / 2669人阅读

摘要:这里强调一下,之前讲过一个操作符按位取反操作符,区别一下他俩,按位取反操作符是针对二进制数每一位全部都取反,包括符号位。

传统艺能?

小编是大一菜鸟不赘述,欢迎大佬指点江山(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.两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

由这里看,加法和减法可以统一起来处理,此外补码和原码相互转换时,其运算过程是相同的,不需要额外的硬件电路。

大小端模式

我昨天的博客专门讲了大小端存储模式专题,其实大小端的检验也可以用今天的知识来解决:

# includeint 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;

其结果:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125072.html

相关文章

  • C语言进阶第一问:数据在内存是如何存储?(手把手带你深度剖析数据在内卒存储,超全解析,码住不

    摘要:在符号位中,表示正,表示负。我们知道对于整型来说,内存中存放的是该数的补码。在计算机系统中,数值一律用补码来表示和存储。表示有效数字,。规定对于位的浮点数,最高的位是 ...

    ghnor 评论0 收藏0
  • 13 万字 C 语言从入门到精通保姆级教程2021 年版 (建议收藏)

    摘要:友情提示先关注收藏,再查看,万字保姆级语言从入门到精通教程。及大牛出天地开始有随之乃有万种语年英国剑桥大学推出了语言。 友情提示:先关注收藏,再查看,13 万字保...

    zombieda 评论0 收藏0
  • JavaScript基础之数据类型

    摘要:原始数据类型和原始数据类型实在太简单,所以只简单划几个重点原始数据类型不可改变原始数据类型一个非常重要的特征就是不可改变。引用数据类型这里的不是狭义的,包含的预定义引用类型,对,这些都是引用数据类型。 JavaScript是脚本语言 计算机语言可以分为三类,机器语言、汇编语言、高级语言。高级语言又可以简单分为解释类和编译类。这个知道就够了。 机器语言: 计算机所能识别的二进制语言,一般...

    pinecone 评论0 收藏0
  • C语言】从入门到入土(进阶之数据存储

    摘要:还不清楚原码反码补码的可以到语言从入门到入土操作符篇中的移位操作符处学习一下。比如原码反码补码原码显示值补码数据存放内存中其实存放的是补码补码的表示与存储在计算机系统中,数值一律用补码来表示和存储。 ...

    mcterry 评论0 收藏0
  • C语言深层理解:函数栈帧创建与销毁

    摘要:语言深层理解函数中栈帧的创建与销毁引言引言问题一引言问题二引言问题三一栈的简单认识内存的简单了解栈的简单了解栈的定义栈的结构二寄存器与简单的汇编指令寄存器的定义寄存器的分类简单的汇编指令三栈帧的创建于销毁调试调用堆栈调 ...

    archieyang 评论0 收藏0

发表评论

0条评论

LeanCloud

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<