一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的;
我们知道创建一个整形需要分配4个字节的空间,那它是如何让存储的呢?
通过学习,我们知道对于整形来说:数据存放内存中其实存放的是补码。
先来了解一下源码,反码,补码。
源码:直接将二进制按照正负数的形式翻译成二进制就可以。
反码:将源码符号位不变,其他位依次按位取反。
补码:反码+1。
看代码
#include<stdio>
int main()
{
int a=10;
int b=-20;
}
a的地址 10的十六进制为00 00 00 0a
b的地址 -20的十六进制为ff ff ff ec
我们发现了顺序有点不对劲。
这是为什么?
大小端介绍
什么是大端、小端?
大端模式:是指数据的低位保存在内存的高地址中,而数据中的高位保存在内存的低地址中。
小端模式:是指数据的低位保存在内存的低地址中,而数据中的高位保存在内存的高地址中。
所以,10、-20都是低地址放在数据的高位;所以为小端存储模式。
设计一个小程序判断当前机器的字节序。
#include<stdio.h>
int check_sys()
{
int i = 1;//1为大端,0为小端
return (*(char*)& i);
}
int main()
{ int a = 10;
int ret = check_sys();
if (ret == 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
练习:以下程序输出多少?
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
//10000000 00000000 00000000 00010100 -20的源码
//11111111 11111111 11111111 11101011 -20的反码
//11111111 11111111 11111111 11101100 -20的补码
//00000000 00000000 00000000 00001010 无符号10的源码,补码,反码
//11111111 11111111 11111111 11110110 -20+10的补码
//11111111 11111111 11111111 11110101 -20+10的反码
//10000000 00000000 00000000 00001010 -20+10的源码