数据的存储

举报
昔皮笑脸 发表于 2023/07/29 00:13:58 2023/07/29
【摘要】 一、release 和 Debug 的区别 二、数据类型介绍 三、整型在内存中的存储 四、为什么地址是倒着存放的 五、练习

一、release 和 Debug 的区别

1、在Debug 版本下,这样越界访问会导致死循环,这是由于我们的数据都是由高地址向低地址存放,而 i 的地址在 arr 数组地址之上,而 for循坏的越界访问会导致 i 的地址被 arr数组地址覆盖,所以 i 每次循坏到12时又会被初始化为0,形成死循环.

2、而在release 版本下,i 的地址比 arr数组地址要低,这样则避免了死循环的发生,release 实际上是 Debug 的优化版本.

二、数据类型介绍

1、long类型在32位下是4个字节,在64位下是8个字节.

2、int a 代表这块内存中存放4个字节的整形数据,float f 代表这块内存中存放4个字节的浮点类型数据.

1、char 类型同样也是整形,因为字符本质上是ASCII码值,是整形.

2、数据的类型有可以分为有符号和无符号,有些数据实没有负数的,用unsigned + 数据类型 来表示,值得一提的是 int 和 signed int 是一样的,short 和 long 也是,除了char,这取决于编译器.

3、float 类型精度低,存储的数值范围较小,double 类型精度高,存储的数值范围较大.

4、构造类型,可以根据需求来创造自己的类型,去掉数组名就是他们的类型.

5、空类型,函数不会返回值,()里的void 代表函数不需要传任何参数,即便传了过去也会调用函数,不过编译器会发出警报.

三、整型在内存中的存储

1、整数的二进制表示也有三种表现形式

  正整数的原码、反码、补码都是一样的

  负整数原码、反码、补码需要计算

原码:直接通过正负的形式写出的二进制序列就是原码

反码:符号位不变,其他位按位取反

补码:反码+1

2、内存中存的都是补码,并且地址是倒着存放的

3、为什么内存中存的是补码

因为用原码来进行加减,答案是错误的,而补码是正确的,并且要想从补码求得原码,有两种方法,

一是补码-1得到反码,再把反码按位取反得到原码.

二是补码取反+1也可以得到原码.

四、为什么地址是倒着存放的

1、把一个高位字节序的内容存放在低地址处,把低位字节序的内容放在高地址处,就是大端字节序存储.

2、把一个低位字节序的内容存放在低地址处,把高位字节序的内容放在高地址处,就是小端字节序存储.

3、如何判断计算机是小端字节存储还是大端字节存储.

创建变量 int a = 1;假设是小端的话低地址就是 01,假设是大端的话低地址就是 00,我们将变量 a强制类型转换为 char 并解引用1个字节(char类型只能解引用一个字节),假设解引用的结果为 1,则是小端类型存储,否则是大端类型存储.

五、练习

答案是 -1  -1  255.

有符号char 的取值范围是-128~127,无符号数char 的取值范围是0~255.

printf输出的是原码,同时c 又是无符号数 11111111,打印出原码就是255.

short 类型的取值范围是-32768~32767,unsigned short 的取值范围是0~65535

此处11111111 是截断出来的补码,由于c 是无符号整形类型,所以前面24位全都补0,00000000000000000000000011111111--补码,又因为正数的原码、补码、反码都相同,所以结果是255.

练习2、

补码

此时的a 不是无符号整形,所以截断 10000000,前24位补的是1,11111111111111111111111110000000--补码,因为要打印无符号整形,所以默认a 是正数.

第一个a 的答案是4294967168.

第二个a 打印原码的结果为-128.

练习3、

-20 和 -10 补码相加,再转换为原码并打印,结果是-10.

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。