学习目标:
`数据在内存中的存储
学习内容:
1.大端存储模式:数据的低位保存在内存的高位地址,数据的高位保存在内存的低位地址。
2.小端存储模式:数据的低位保存在内存的低位地址,数据的高位保存在内存的高位地址。
例如:0x11223344,这一个16进制数的最高位是1,最低位是8
3.百度笔试题:设计一个小程序判断当前机器的字节序
#include <stdio.h>
int main()
{
int a = 1;
//char*类型指针一次访问一个字节,判断大端小端只要判断访问的这个字节上存的是01,还是00
char* p =(char*)&a;//&a得到的地址是int*类型的,一次访问四个字节,为了访问一个字节,需要强制转换成char*类型
if (*p == 1)
{
printf("小端\n");
}
else
printf("大端\n");
return 0;
}
以此为基础还可以将其改为更为简便的函数返回值形式
#include <stdio.h>
int da()
{
int a = 1;
return *(char*)&a;
}
int main()
{
if (da() == 1)
{
printf("小端\n");
}
else
printf("大端\n");
return 0;
}
4.有符号位进行高位提升,补的是符号位;无符号位进行高位提升,统一补0。
例如:由这个结果可以看出char a是默认为有符号类型的。
高位提升:有符号位进行高位提升,补的是符号位;无符号位进行高位提升,统一补0。
-1的原码为:10000000000000000000000000000001
补码为:11111111111111111111111111111111
此后在补码上进行char类型变量赋值,只能赋值后八位(截断了),得到11111111
打印a的整数类型,整数类型是32位,现在char类型后只有8位了,所以需要“高位提升”。
提升后得到11111111111111111111111111111111(补码),因为打印出的是原码,所以把补码转换成原码,得到-1。由此可得b也是-1。
char c 的补码也是11111111,但是它高位提升后为00000000000000000000000011111111,转换成原码就是255。
5. %u是打印无符号整形,认为内存中存放的是一个无符号整形的补码。