有符号的二进制表示及转换

本文探讨了有符号二进制表示,包括原码、反码和补码的概念。介绍了正负数在二进制中的表示,强调了补码的重要性。还讨论了互为相反数的整数在二进制下相加等于零的性质,并举例说明了这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有符号的二进制表示:

补充:

在计算机中,负数以其正值的补码形式表达
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
反码:将二进制数按位取反(0变1,1变0),所得的新二进制数称为原二进制数的反码。
补码:反码加1称为补码。

最左边的看作符号位,为1表示负数,为0表示非负数

(即 有符号的二进制表示较无符号的少了1/2(这里指非负数和负数要各占一半),这就能解释为何
int型取值范围为:-2^31 ~ 2^31-1,而unsigned int(无符号整数型)取值范围为:2^32)

正变负 :各个位数取反再加一

负变正 :各个位数减一再取反(等同于取反再加一)

例:(众所周知,一个整数占四个字节,即四个8比特位)

因此,整数在计算机眼中应该是这样的:

二进制

十进制

00000000 00000000 00000000 00000010

 2

00000000 00000000 00000000 00000011

 3

00000000 00000000 00000000 00000111

 7

00000000 00000000 00000000 00001010

10

二进制

十进制

11111111 11111111 11111111 11111110(11111111 11111111 11111111 11111101+1)

- 2

11111111 11111111 11111111 11111101(11111111 11111111 11111111 11111100+1)

- 3

11111111 11111111 11111111 11111001(11111111 11111111 11111111 11111000+1)

- 7

11111111 11111111 11111111 11110110(11111111 11111111 11111111 11110101+1)

-10

互为相反数的整数的二进制表示形式相加等于零吗?

是的。实际上,二进制中只有0和1的形式,即其表示数只有0,1,-1,相加实质为零

例 : 2 : 00000000 00000000 00000000 00000010   

      -2 : 11111111 11111111 11111111 11111110  相加为1 00000000 00000000 00000000 00000000(1舍掉)

补充思考 : 在有符号整数的二进制表示中,首位即为符号位,而最高的表示数为 2^31-1(01111111 11111111 11111111 11111111),因此正数符号位为0(包含0(00000000 00000000 00000000 00000000));

而负数二进制为正数补码(正数取反加一),因此符号位为1;

而所能表示数中负数与非负数各占一半,对应的就是首位取0取1的问题

有符号十进制数转换二进制通常使用的是除2取余法(也称为“长除法”),这种方法适用于整数。下面是步骤: 1. **确定数值范围**:对于有符号整数,我们需要考虑它的正负。对于32位系统,例如int类型的值,在二进制表示时需要占用32位,其中最高位(符号位)代表正负。 2. **判断符号**:如果数字是正数,则从最右边开始处理;如果是负数,则先将其转换为补码形式(即加一个足够大的绝对值后进行转换),然后处理结果的补码形式。 3. **除2取余**: - 对于每个整数位(从最低位到最高位),用该数去除以2,得到商和余数。 - 记录下每个操作的余数,余数就是二进制对应的位(0或1)。 - 当商变为0时停止,因为此时余数包含了完整的二进制表示。 4. **处理符号位**:如果原数是负数,根据补码规则,最高位(符号位)通常是1。如果是正数,这个位是0。 5. **合并结果**:把所有记录下来的余数从低到高排列起来,就得到了原始有符号十进制数的二进制表示。 以下是一个简单的C语言代码片段,演示了如何将一个有符号整数转换二进制字符串: ```c #include <stdio.h> #include <string.h> // Function to convert a signed decimal number to binary string void int_to_binary(int num, char* result) { int remainder; if (num == 0) { *result = '0'; return; } // Determine sign int is_negative = num < 0 ? 1 : 0; num = abs(num); // Convert to binary for (int i = 31; i >= 0; --i) { remainder = num % 2; num /= 2; result[i] = remainder + '0'; // Convert to ASCII character } // Add the sign back if (is_negative) { result[0] = '-'; } result[32] = '\0'; // Ensure null terminator } int main() { int num; printf("Enter a signed integer: "); scanf("%d", &num); char binary[33]; // Assuming a 32-bit system int_to_binary(num, binary); printf("Binary representation: %s\n", binary); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值