整数的二进制位有三种:原码、反码、补码,内存存放的是补码 有符号位最高位表示0\1,0代表正,1代表负 正整数的原、反、补相同 负整数三种表示方法都不同
补码在内存中存储的时候有大小端?那它到底是什么呢?


当一个数据的大小超过一个字节的大小时,就有不同的存储的顺序问题,分为大端字节序存储和小端字节序存储。 理论上怎么存放数据都行,只要拿的出来数据就行,具体怎么存我们并不关心,但是也不能采用随便乱放(因为拿出来不方便) 因为顺序是以字节为单位存储的,所以叫大端字节序存储和小端字节序存储。而”大小端“是由格列夫游记小说灵感(历史原因)


由此可以看出当前VS采用的是小端存储(与当前的硬件是有关系的)


要想解决这个问题,先要想办法拿到里面的第一个字节?
int check_sys()
{
int n = 1;
return *(char*)&n;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
}注意:不能够直接强制类型转化(char)c=(char)n,因为强制类型转化总是拿到的是最低位的字节,无论大端还是小端,都先把数据拿出来只取最后一位字节(最低位),没办法判断是否为大端还是小端
signed char的理解方式:

unsigned char 的理解方式

题目分析:

先把要赋值的整数的补码(判断正负号)写出来,从后往前取8位,虽然a、b、c三者的类型都不相同,但是里面存放的是都是8个1,但是该如何去看里面的值是什么,需要看三者的类型了,另外char以整形的方式打印需要整形提升(取决于三者的类型),有符号位按照符号位提升,无符号为补零,提升完依然是补码,%d以有符号打印出来需要判断补码的正负号(如果是%u就不需要判断了,也不需要转为原码,因为%u不存在原、反、补),进一步转化并打印原码

易错点:

例题讲解: 题一:

答案是255 题二:
当指针强转为整形加一时,该如何去加?

补充:如果想打印十六进制的前面的0x
可以在%后面加#

引入:

事实果真如图片上所示吗?

这个可以说明整形与浮点型的存储方式不一样
那浮点数该如何存储呢?如何解释这道题?

如何将十进制浮点数转为二进制呢?
这个需要看权重在小数点前是0、1、2、3……,小数点后是-1、-2、-3……,转化为科学计数法,也遵循十进制的转化方法,然后任何二级制都可以转化为国际标准的公式

所以只要存放公式里面的S、M、E这三个参数就行了,需要时再把它拿出来

M一定是大于等于并且小于等于2(一定可以化成),因为E可以是负数




有了以上知识,就可以理解刚开始的题目(本质上是所对应的是视角不同,往内存里面拿数据)
