原、反、补码
计算机中的整数有三种表示方法,即原码、反码和补码。其中负整数符号位用‘0’表示“正”,负整数用’1‘表示“负”。
对于正整数的原码、补码、反码都是相同的。
例如:
第一位“0”代表符号位,即为“正”。“1010”即为10的二进制数。
对于负整数的原码、反码、补码来讲,三者略有区别。
负整数原码:直接将二进制按照负数的形式翻译成二进制就可以,第一位符号位“1”。
负整数反码:将原码的符号位不变,其他位依次按位取反就可以得到了。
负整数补码:反码+1就得到补码。
例如:
负整数原码变反码是切记符号位不变。
接下来进行一个简单的计算,比如:1-1
首先1-1我们可以看成1+(-1),我们分别写出1的原码、补码、反码:
00000000000000000000000000000001(正整数三者相同,所以就只写一个)
-1的原码:10000000000000000000000000000001
-1的反码:11111111111111111111111111111110
-1的补码:11111111111111111111111111111111
我们先进行原码·计算:
通过这个计算,我们可以看出结果是一个负值,而二进制“10”转化为十进制则为“2”,所以1-1由原码计算得出结果为“-2”,显然与我们知道的1-1=0结果相违背,所以原码计算不正确.
接下来试试补码进行计算:
所以我们通过补码进行计算得出的结果为“0”,正好符合1-1=0。所以,我们计算时要用补码进行计算。
大小端字节序存储:
大小端字节序存储分为大端字节序存储、小端字节序存储。
大端字节序存储:把一个数据的低位字节处的数据存放在高地址处把高位字节的数据放在低地址处
小端字节序存储:把一个数据的低位字节处的数据存放在低地址处把高位字节的数据放在高地址处
分辨大小端:
使用共用体,因为共用体内是共享一份空间的,所以int a = 0x11 22 33 44占据了四个字节,假设是小端第一个字存的就是数据的低位0x44,所以char c只占据了第一个字节即0x44.
union U
{
int a;
char c;
};
int fun()
{
union U u;
u.a = 0x11223344;
if (u.c == 0x44)
{
return 1;
}
else
return 0;
}
int main()
{
int i = fun();
if (i == 1)
{
printf("小端模式\n");
}
else
{
printf("大端模式\n");
}
return 0;
}