数据的存储

一、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.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值