char类型的-128到底是个神马东西?

char类型的-128的补码是什么样的?

在计算机中,负数通常使用补码形式来表示。对于一个有符号的 char 类型,其大小为 8 位(1 字节),可以表示从 -128 到 127 的整数。

-128 是有符号 8 位整数能够表示的最小值。它的二进制补码表示是特殊的,因为它是唯一一个没有正数对应项的负数。在 8 位系统中,-128 的补码直接就是 1000 0000

这里是如何得到这个结果的简要解释:

  1. 首先,考虑正数 128 的二进制表示,它会是 1000 0000,但是这超出了 8 位所能表示的范围(0 到 127)。
  2. 因为 -128 没有对应的正数值,所以它不需要通过正常的“取反加一”过程来得到补码。实际上,1000 0000 直接被定义为 -128 的补码。

因此,-128 的 8 位二进制补码表示就是 1000 0000。这是个特殊情况,因为在 8 位二进制中,这个模式既是 -128 的补码也是 -128 的原码和反码。

也就是说char类型的-128的补码,它的符号位参与数字大小的计算了吗?

在有符号的 8 位 char 类型中,-128 的二进制补码表示是 1000 0000。这里的最高位(最左边的一位)确实是符号位,它表明这个数是一个负数。

在补码表示法中,符号位并不直接参与数值大小的计算,但它确实影响了整个数值的解释。对于正数,符号位是 0,而对负数来说,符号位是 1。补码系统的设计使得加法和减法运算可以统一处理,不需要特殊的硬件来判断是否需要进行减法操作。

对于 -128 的情况:

  • 它的补码形式是 1000 0000
  • 符号位是 1,这表示这是一个负数。
  • 剩下的 7 位 000 0000 在这里并没有单独表示一个正数的值,因为这是 -128 的特殊情况。

通常,如果我们有一个负数的补码,我们可以通过以下步骤将其转换回原码(即绝对值):

  1. 将除了符号位外的所有位取反。
  2. 对结果加 1。

但对于 -128 (1000 0000),如果尝试这样做:

  • 取反:0111 1111
  • 加 1:1000 0000

我们会发现最终还是得到了 1000 0000,这是因为 -128 没有对应的正数形式,它是补码表示中的一个特例。因此,在这种情况下,符号位实际上定义了整个数值,并且没有独立的“数字大小”可以与之分离。整个 8 位模式作为一个整体表示 -128。

”这是因为 -128 没有对应的正数形式“这句话是什么意思?

这句话的意思是,在 8 位有符号整数的补码表示中,-128 是一个特殊情况,因为它没有一个对应的正数值。通常,每个负数都有一个对应的正数值(绝对值),例如 -1 的补码是 1111 1111,其对应的正数 1 的二进制表示是 0000 0001

但是,对于 -128,它的 8 位补码表示是 1000 0000。如果我们试图通过常规的方法(取反加 1)来找到与之对应的正数,我们会得到以下结果:

  • 取反:0111 1111
  • 加 1:1000 0000

这又回到了 1000 0000,也就是 -128 本身。因此,-128 在 8 位有符号整数中是一个边界情况,它没有一个可以与其相匹配的正数形式。这是因为 8 位有符号整数能够表示的范围是从 -128 到 127,而 128 超出了这个范围。

简而言之,-128 没有一个在 8 位内的正数对应项,因为它已经是最小的负数了,再往更小的方向就超出了 8 位所能表示的范围。

#include<stdio.h>

int main()
{
	char a = 2183;
	printf("%d\n", a);
	//1000 1000 0111,2183的补码
	//1000 0111,截断后的补码;
	//符号位为1,为负数,需要转化成源码
	//1000 0110
	//1111 1001
	char b = 129;
	printf("%d\n", b);
	//129的补码:0000 0000 0000 0000 0000 0000 1000 0001
	//截断后的补码:1000 0001
	//减1取反(符号位不变):1111 1111 为-127

	return 0;
}

正常情况下,符号位不参与数字大小的计算

在正常情况下,符号位不直接参与数字大小的计算。在补码表示法中,符号位(最高位)用于指示数值的正负,但实际的数值大小是由剩余的位来表示的。

对于一个有符号的 8 位二进制数:

  • 如果符号位是 0,那么这个数是非负数(包括0和正数),其值由剩下的7位决定。
  • 如果符号位是 1,那么这个数是负数,其绝对值也由剩下的7位决定,但是需要通过补码到原码的转换来得到。

例如,考虑以下 8 位二进制数:

  • 0111 1111 表示 +127,这里的 0 是符号位,表明这是一个正数,剩下的 111 1111 表示 127。
  • 1000 0001 表示 -127,这里的 1 是符号位,表明这是一个负数,剩下的 000 0001 在取反加 1 后表示 127 的补码形式。

当进行算术运算时,符号位会自然地参与到整个运算过程中,而不需要单独处理。例如,两个补码表示的数可以直接相加或相减,结果也是以补码的形式给出,计算机硬件会自动处理符号位的进位和借位问题。

总结来说,符号位本身并不直接用来计算数值的大小,但它确实决定了整个数值的正负,并且在进行算术运算时,它是整个二进制数的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值