C语言--原码,补码,反码、大小端字节序存储

本文介绍了计算机中整数的三种表示方法——原码、反码和补码,强调了负数在不同码制下的转换规则,并通过实例展示了1-1运算在原码和补码计算下的差异,证明了补码计算的正确性。同时,讨论了大小端字节序存储的概念,提供了使用共用体判断系统字节序的方法。
摘要由CSDN通过智能技术生成

原、反、补码

计算机中的整数有三种表示方法,即原码、反码和补码。其中负整数符号位用‘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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值