整数在内存中的存储
整数的2进制表⽰⽅法有三种,即 原码、反码和补码
三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最
⾼位的⼀位是被当做符号位,剩余的都是数值位
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
对于整形来说:数据存放内存中其实存放的是补码。
⼤⼩端字节序和字节序判断
什么是⼤⼩端?
⼤端(存储)模式:
是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。
⼩端(存储)模式:
是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。
⼀个
16bit
的
short
型
x
,在内存中的地址为
0x0010
,
x
的值为
0x1122
,那么 0x11 为⾼字节,
0x22
为低字节。对于⼤端模式,就将
0x11
放在低地址中,即
0x0010
中, 0x22 放在⾼地址中,即
0x0011
中。⼩端模式,刚好相反。我们常⽤的
X86
结构是⼩端模式,⽽ KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是 ⼤端模式还是⼩端模式。
判断大小端
#include<stdio.h>
//判断大小端
int main()
{
int a = 1;
//取出a的地址,
// 如果为大端存储00在第一个字节,小端存储01在第一个字节
int r = *(char*)&a;//只观察第一个字节,一共四个字节,强制转换成
if (r == 1)
printf("小端");
if (r == 0)
printf("大端");
return 0;
}
int check_sys()
{
int n = 1;
return *(char*)&n;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
//0x00 00 00 01
//01 00 00 00
//00 00 00 01
return 0;
}