整形在内存中的存储
整形在内存中的存储
创建一个变量是需要在内存中开辟空间的。空间的大小是根据不同类型决定的。
那么,整形数据在内存中是如何存储的呢?
例如:一个 int 型的变量,所占4个字节空间,那么数据在空间里如何存储呢?
原码、反码、补码
计算机中的有符号数,有三种表示方法,即:原码、反码、补码。
这三种表示方法都有 符号位 和 数值位。
符号位:用 0 表示 ”正” ,用 1 表示 “负” 。
原码
直接将二进制按照正负数的形式翻译成为二进制就可以。
反码
将原码的符号位不变,其他位按位取反就可以得到反码。
补码
反码 + 1 就可以得到补码。
注意
对于正数的原码、反码、补码都相同。
对于整形来说,数据存放在计算机的内存中,其实存放的都是补码。
因为,CPU只有加法器。
例如:
在调试窗口打开内存查看:
调试的相关知识,见下面链接:
调试的重要性
#include <stdio.h>
//在计算机中整形在内存的存储
//原码、反码、补码
int main()
{
int a = 30;
//a的原码、反码、补码均为:00000000 00000000 00000000 00011110
int b = -20;
//b的原码:10000000 00000000 00000000 00010100
//b的反码:11111111 11111111 11111111 11101011
//b的补码:11111111 11111111 11111111 11101100
int c = a + b;
//a+b:
//00000000 00000000 00000000 00011110
//11111111 11111111 11111111 11101100
//+
//00000000 00000000 00000000 00001010 ->10
return 0;
}
a的补码二进制转换为16进制为:0x0000001e
b的补码二进制转换为16进制为:0xf f f f f fec
c的补码二进制转换为16进制为:0x0000000a
如上图,我们可以发现,整形数据在内存中是按照补码的方式存储的。
另外 我们还发现数据在内存中,不是按照我们习惯的方式存储,而是“倒着”,如下图:
这种方式称为:小端存储
大、小端存储模式
什么是大端、小端
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在低地址中;
例如:a -> 0x0000001e 在大端模式中: 00 00 00 1e
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在高地址中;
例如:a -> 0x0000001e 在小端模式中:1e 00 00 00
我们平常接触到机器为:小端机。
编写程序,判断当前的机器为大端机还是小端机:
方法1:
在int型给char型的时候,发生了截断,将首元素给了ch,如果最后一位是0,则是大端机;否则是小端机。
//截断
#include <stdio.h>
int main()
{
int val = 1;
char ch = val;//发生了截断,将最后一个字节给了ch
if (ch)//如果是0,就是大端机
{
printf("小端\n");
}
else
{
printf("大端\n");
}
}
方法2:
强转:
在这里将i的地址的首元素强转为char* ,然后解引用找到,判断是否为1
//强转
#include <stdio.h>
int main()
{
int i = 1;
//在这里将i的地址的首元素强转为char* ,1个字节,然后解引用找到,判断是否为1
if (*(char*)&i)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}