数据的存储
一、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)