整型在内存中的存储,即二进制中原码、反码、补码介绍

理解C语言中整数的原码、反码和补码及字节序
本文介绍了计算机中整数的三种表示方法——原码、反码和补码,强调了正负数在这些表示中的差异,并详细解释了从原码到补码的转换过程。此外,还探讨了字节序的概念,特别是在大端和小端储存模式下的数据存储规则,并给出了判断系统字节序的代码示例。

整数的表示方法

在计算机当中,整数有三种表示方法就是这次所说的,原码反码补码

三种表示方法均都包括符号位和数值位两部分,符号位中用0表示“整数”,用1表示“负数”。

而且我们符号位为0也就是正数的原码、反码、补码都相同

负整数也就是符号位为1的整数,三种表示方法就各不相同了

 如上例,0->正数、1->负数。

原码:直接将数值按照正负数的形式翻译成二进制就得到原码。

反码:将原码的符号位不变,其他位按位取反就得到反码。

补码:给得到的反码+1就可以得到补码,一般我们在内存中储存的就是补码。

不过我们现在知道从原码到补码只有一种方式,就是把原码数值位按位取反然后在+1,但是从补码到原码有两种方式。

1、可以将补码反向操作,先-1再取反得到原码。

2、也可以将补码再次取反+1,也能得到相应原码。

知道了原码、反码、补码,那接下来还要知道大小端字节序

如果一个数值超过一个字节,那它要存储到内存中,就要有顺序的区分。

大端储存模式下,数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中;

小端储存模式下,数据低位保存在内存低位,数据高位保存在内存高位;

那如果想要判断,我们的储存模式是大端还是小端怎么办呢?

看下面这段代码↓↓↓↓

int main()
{
	int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
		printf("小端");
	else
		printf("大端");
	return 0;
}

将int类型的a强制转换成char类型

我们知道char类型只占1个字节

所以说只要判断出a首地址是不是1就能知道储存类型是大端还是小端。

### C语言中原反码补码的概念 #### 定义与表示方式 在计算机科学中,原是最直观的二进制表示形式。对于一个字节(8位),最高位作为符号位:“0”代表正数,“1”代表负数;剩余7位用来表达绝对值大小[^3]。 当涉及到负数时,为了便于硬件实现算术操作并提高效率,引入了反码概念。具体来说,如果已知某个整数x的原,则其对应的反码可通过保持符号位不变的情况下将其余各位取反得到[^1]。 进一步地,在实际应用尤其是编程语言如C当中更倾向于采用补码体系来进行数据存储及处理。这是因为补码不仅能够有效地解决加减法统一的问题,还简化了CPU内部的设计复杂度。对于任意给定的一个有符号整型变量y而言: - 若该值为正值或零,则其补码与其原完全一致; - 如果是负数值的话,则先求得对应于它的反码之后再加上一即可获得最终结果。 ```c #include <stdio.h> void show_binary(int num){ unsigned int mask = 1 << (sizeof(num)*8 - 1); while(mask){ printf("%d", !!(num & mask)); mask >>= 1; } } int main(){ signed char a=-5; //定义带符号字符类型的a赋初值为-5 printf("The binary representation of %d is ",a); show_binary(a); return 0; } ``` 上述程序展示了如何查看特定平台下编译器对`signed char`类型的数据按照补码规则编后的二进制字符串表现形式。通过调用自定义函数`show_binary()`可以逐位打印出目标对象的实际内存布局情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值