1.辨析原码反码补码:
1.原码:有32位(int类四个字节,一个字节八个比特位),第一位是符号位,0正1负,其余为二进制位。
2.计算一般是对原码进行计算,但在负数计算使用原码会导致程序出错,所以负数计算中使用反码,反码就是除了符号位,其余位置取反,反码存在的原因就是负数的计算
3.虽然有了反码,但遇到负数跨0比如-6+7=1的问题时无法解决,所以产生了补码,补码等于负数的反码加1
2.正整数的原码补码反码都相等,负数的原码正常,反码为第一位不变其余位按位取反,补码位反码加一
3.在整形存储中一般以补码的形式存在,因为这样可以使符号位与数值位统一处理,加法和减肥都可以统一处理(cpu只有加法器),其运算过程是相同的不需要额外硬件
4.大端和小端:超过1字节的数据在存储的时候就会存储顺序的问题,按照不同的存储顺序,分为大端字节序存储和小端字节序存储:
1.大端模式:数据的低位字节内容保存在内存的高地址处,数据的高位字节内容保存在内存的低地址处
2.小端模式:低位字节内容保存在内存的低地址处,高位字节内容保持在高地址处
5.大小端存在的原因:
6.判断大小端的方法
7.例题:
析题:在内存中,数据储存首先进行一个截断操作,将变量补码的后八位取出,然后会进行一个还原操作,会用符号位的数值将截断码补成32位,补充之后的码继续作为原码。以‘%d'的形式打印,就是打印一个十进制有符号的整数,而操作对象是变量的补码,a,b两个变量的补码的运算结果为-1,而c的补码首位是0.所以它的补码等于原码等于它本身,所以是255
8.例题2:
析题:内存存储
%u表示打印十进制无符号整型,上表表示了在内存中所有有符号字符型的存储可能(8个字节),可以发现范围是+127到-128,而中间的0000000会自动解析为128,无符号字符型的取值为0到255,
而无符号整型的补码是它自己,直接把128的补码的截断补充的形式打印出来
9.例题3
答案是256,为啥?
析题:
char类型的整型范围有以上规律,是一个闭合的环,而strlen函数就是找\0,而'\0'的asc码值为0,就是找char 0的位置,按照上图正好循环一圈,为255个数
10.例题4
析题:无符号整型也是一个闭环,0-1等于2的33次方-1(2的33次方减1然后加一为2的33次方,但int只能储存2的32次方,所有按照截断方法来看该值就是0),就是所有位都是1然后再减。
11.在强转出现时,应先计算右侧式子,然后再进行强转
12.例题五
析题:
先假设数据的存储是小端类型:
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
p1取的是数组的地址,加一代表指针指向了数组最后一个元素的后面,此时指针类型为数组指针,
此时将指针转化为int*型,每次进行运算时移动四个字节,而p1[-1]代表向前移动四个字节,然后读取,为4,而p2的运算,依据11,指向2的同时进行类型转换为int类型,而转换为int类型的同时编译器会读取向后的四位为一个数字2000000,前面的0不读取,然后转换为int*类型然后读取打印,结果为2000000。