原码、补码说明以及char和unsigned char区别--最终版

本文详细介绍了原码、补码的概念,强调它们只适用于整数表示,而不适用于实数。讨论了补码的计算规则,以及补码与原码之间的关系。此外,文章还探讨了char和unsigned char的区别,特别是在处理负数和正数时的差异,以及这两种类型在内存中的存储和计算方式。最后,文章提供了关于不同数据类型在运算过程中的转换规则和注意事项。
摘要由CSDN通过智能技术生成

0、

原码、补码(以及反码)这些概念都是对整数而言的,即原码、补码所表示的实际数值都是整数。而对实数(即带有小数点的数值,如5.0,,5.5)而言,是没有原码、补码(以及反码)这些概念的,即实数不能用原码、补码来表示。

原码,对应表示的是整数中的正整数部分;补码,对应表示的是整数中的负整数部分。



0,无论用原码还是补码表示,其值都是为0(即其原码值为0,其补码值也为0)。

对应能表示整数的数据类型: Int 、char等。

对应能表示实数的数据类型: float 、double等。

1、

反码:即对原码的各位取反所得的结果。

补码=反码+1。

注释:

补码的一个规定是补码的最高位要为1。故而作为补码的二进制数值的最高位必为1,最高位为1的二进制数值,我们可以视其为补码,也可以视其为原码。

通过上述这个从原码到补码的转换的方法,所得的值不一定是补码(即所得的二进制数值的最高位不一定为1),当原码(值所要存储的变量)为n位,补码(值所要存储的变量)也为n位,且原码最高位为1时,所得的n位补码的最高位一般不为1,即不是补码。上述方法能取的补码的前提是补码(值所要存储的变量)所要存储的位数要比原码(值所要存储的变量)的位数(至少)多一位,这个相当于说,补码(值所要存储的变量)所要存储的位数和原码(值所要存储的变量)的位数可以一样,但是原码(值所要存储的变量)的位数中从左向右数(连续的至少)一位是始终只能置为0的。

若我们要求的一个负整数a的补码的位数是n位的话,则该负整数a对应的正整数|a|的原码只能用n-1位(也就是说n位的补码只能表示2的n-1次方个负整数),这样就保证在原码取补码时最高位为1,而这个最高位我们就称其为符号位了。

2、

负数经过补码算法后所得的补码的最高位必然为1的。

对于一个变量的二进制值是视作原码还是视作补码,取决于变量的数据类型是有符号的(signed),还是无符号的(unsigned):

2).1

对于一个变量(如Int iR;)的二进制值的最高位为0的,

无论变量的数据类型是有符号的(signed),还是无符号的(unsigned),二进制值必然都是一个原码值。

2).2

对于一个变量的二进制值的最高位为1的,

如果该变量的数据类型是有符号的(signed),则二进制值必然都是一个补码值。
如果该变量的数据类型无符号的(unsigned,则该二进制值必然都是一个原码值。

3、

因为char类型的变量的最高位用于做符号位,不做数据位,所以char类型的变量的最高位为0的表示是正整数(也就是原码),char类型的变量的最高位为1的表示是负整数(也就是补码)。也就是说,char类型的变量的数据位为7位,故而char 表示的整数范围为-127~127。

因为unsigned char类型的变量的最高位不用于做符号位,还是做数据位,所以unsigned char类型的变量的最高位无论是为0还是为1的都是表示正整数(也就是原码)。也就是说,unsigned char类型的变量的数据位为8位,故而unsigned char 表示的整数范围为0~255。

注释:

char类型的变量的最高位为1,不是我们人为的置为1(即例如,-5的补码值为补码最高位置为1,补码数据位置为5的原码值),而是负数经过补码算法后最高位必然为1的。

所以,补码的一属性必然是有符号的(signed),不可能是无符号的(unsigned)。

4、

补码和补码,补码和原码间的运算前提是要先给补码、原码确定存放其值的变量的数据类型,只有数据类型相同的补码和补码,补码和原码间才可以直接运算:

例如,unsigned char类型的变量,只可以用于存储8bit原码,而char类型的变量,可以用于存储8bit原码和8bit码。

还有同样是8bit原码unsigned char类型的变量存储的8bit原码和signed char类型的变量存储的8bit原码不可直接运算,因为

### 回答1: Unsigned charchar 的主要区别在于其范围。一个 char 变量占 1 个字节,可以容纳 -128 到 127 的整数,而 unsigned char 变量同样占据1个字节,但是可以容纳 0 到 255 的整数。因此,char 变量可以表示有符号和无符号的值,而 unsigned char 变量只能表示无符号值。 ### 回答2: unsigned charchar区别在于它们的取值范围和表示方法。 首先,char 是有符号类型的字符型数据,它可以表示从-128到127的整数。其中,负数用补码表示,正数和零用原码表示。而 unsigned char 是无符号类型的字符型数据,它可以表示从0到255的整数,只用原码表示。 其次,char 在内存中占用一个字节(8位),但是与具体的实现有关,有时也可能占用其他大小的字节。unsigned char 也是占用一个字节。 再次,char 主要用于存储和处理字符,例如存储ASCII码表示的字母、数字和符号。而 unsigned char 则常用于表示字节数据,例如像素值、传感器数据等。 最后,char 可以用于执行算术和逻辑运算,包括正负号、加减乘除等操作,而 unsigned char 也可以进行相同的运算,但结果会被解释为无符号的值。 总结来说,unsigned charchar 的主要区别在于取值范围和表示方法。不同的场景和需求会决定使用哪种类型。 ### 回答3: unsigned charchar是在C语言中使用的两种不同类型的数据。它们的主要区别在于其取值范围和对待负数的方式。 首先,char类型是有符号的,它可以表示整数值的范围是-128到127(对应于8位的补码表示)。这意味着char类型可以表示负数和正数。例如,对于char x = -1;,x的值将是-1。 反之,unsigned char类型是无符号的,它仅能表示非负整数值。unsigned char类型的取值范围是0到255(对应于8位的无符号二进制表示)。这意味着unsigned char类型只能表示正数或零。例如,对于unsigned char x = 255;,x的值将是255。 其次,由于char类型是有符号的,它对负数的处理方式是使用补码表示法。这意味着负数使用符号位的方式来表示,并且对应的二进制值是正数值的补码。例如,对于char x = -1;,它的二进制表示为11111111。 与此相反,由于unsigned char类型是无符号的,它没有符号位,因此使用的是直接的二进制值表示。例如,对于unsigned char x = 255;,它的二进制表示为11111111。 综上所述,unsigned charchar之间的主要区别在于它们的取值范围和对负数的处理方式。char类型能够表示负数和正数,而unsigned char类型仅能表示正数或零,并且对于负数的处理方式不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值