找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

原码、反码、补码

2022-4-6 21:52| 发布者: gkket| 查看: 1297| 评论: 0

摘要: 3 原码、反码、补码3.1 知识点补充在计算机内部,所有信息都是用二进制数串的形式表示的。整数通常都有正负之分,计算机中的整数分为无符号的和带符号的。无符号的整数用来表示0和正整数,即自然数;带符号的正数可以 ...

3 原码、反码、补码

3.1 知识点补充

在计算机内部,所有信息都是用二进制数串的形式表示的。整数通常都有正负之分,计算机中的整数分为无符号的和带符号的。无符号的整数用来表示0和正整数,即自然数;带符号的正数可以表示所有的整数。

由于计算机中符号和数字一样,都必须用二进制数串来表示,因此,正负号也必须用0、1来表示。通常我们用最高的有效位来 表示数的符号(当用8位来表示一个整数时,第8位即为最高有效位,当用16位来表示一个整数时,第16位即为最高有效位。)0表示正号、1表示负号。

这种正负号数字化(0表示正号、1表示负号)的机内表示形式就称为机器码或者机器数,而相应的机器外部用正负号表示的数称为真值。将一个真值表示成二进制字串的机器数的过程就称为编码

无符号数没有原码、反码和补码一说。只有带符号数才存在不同的编码方式。带符号整数有原码、反码、补码等几种编码方式。

**原码即直接将真值转换为其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。**正整数的原 码、反码和补码都一样,负数的反码是对原码的除符号位外的其他位进行取反后的结果(取反即如果该位为0则变为1,而该位为1则变为0的操作)。而补码是先求原码的反码,然后在反码的末尾位加1 后得到的结果,即补码是反码+1。IBM-PC中带符号整数都采用补码形式表示。

注意,只是带符号的整数采用补码存储表示的,浮点数另有其存储方式。

  1. 正数的补码是其本身
  2. 负数的反码,符号位不变,其余的按位取反
  3. 负数的补码,反码加1

对于字长为8位有符号的int,因为最高为符号位,占1位,所以最小为(1111111)2 = (-127)10,最大为(0111111)2 = (127)10;即其原码范围为:-127~127

有符号的8位二进制的原值表达范围为:-127至127,此时共255个数字;然而,8位二进制 的补码排列共有A28 = 256个,0000 0000 至1111 1111 。

补码组合范围个数
0000 0000 - 0111 11110 ~+127128
10000000多余的一种组合待定1
1000 0001 - 1111 1111-1~-127127

**10000000 **看似要被浪费掉了啊!其实不然,( 100000000 ) 2 = ( 2^7 ) 10 = ( 128 ) 10,这个组合要利用起来,不能太偏离数值意义,表示128,显得更直观。

**从大到小,依次减1看一下规律:**
十进制 (字长8bit)原码反码补码
1270111 11110111 11110111 1111
1260111 11100111 11100111 1110
……………………
100000 10100000 10100000 1010
……………………
20000 00100000 00100000 0010
10000 00010000 00010000 0001
+00000 00000000 00000000 0000
-11000 00011111 11101111 1111
-21000 00101111 11011111 1110
……………………
-10100010101111010111110110
……………………
-127111111111000000010000001
待定100000001000000010000000

从递减规律中,发现,**10000000 **表示-128更合适。

即规定:-128的补码为 10000000

求10 -10 0 -128 127 的原码、反码、补码

十进制 (字长8bit)原码反码补码
10000010100000101000001010
-10100010101111010111110110
-11000 00011111 11101111 1111
+0000000000000000000000000
-0100000001111111100000000
-12810000000
127011111110111111101111111
-127111111111000000010000001

+0和-0的补码是一样的。即 0的补码只有一种表示,0的补码是0000 0000,

# 四 输出结果,解释为什么是这样的
char c = 128;
printf("%d\n",c);
printf("%hhd\n",c);
printf("%hd\n",c);
printf("%hu\n",c);

4.1 格式输出符

格式符号意义
%a浮点数、十六进制数字和p-记数法 (C99)
%A浮点数、十六进制数字和P-记数法 (C99)
%c一个字符
%d有符号十进制整数
%e浮点数、e-记数法
%E浮点数、E-记数法
%f浮点数,十进制记数法
%g根据数值不同自动选择%f或者%e。%e格式在指数小于-4或者大于等于精度时使用
%G根据数值不同自动选择%f或者%E。%E格式在指数小于-4或者大于等于精度时使用
%i有符号十进制整数 (与%d相同)
%o无符号八进制整数
%p指针(就是指地址)
%s字符串
%u无符号十进制整数
%x使用十六进制数字0f 的无符号十六进制整数
%X使用十六进制数字0F的无符号十六进制整数
%%打印一个百分号
## 4.2 格式输出其修饰符
修饰符意义示例
h和整数转换说明符一起使用,表示一个short int 或者 unsigned short int 类型数值。"%hd
hh和整数转换说明符一起使用,表示一个signed char 或者unsigned char类型数值。"%hhd"
j和整数转换说明符一起使用,表示一个intmax_t或uintmax_t值。"%jd"
l和整数说明符一起使用,表示一个long int 或者unsigned long int 类型值。"%8lu"
ll和整数说明符一起使用,表示一个long long int或 unsigned long long int 类型值 (C99)。"%lld"
L和浮点转换说明符一起使用,表示一个long double值。"%8.4Le"
t和整数转换说明符一起使用,表示一个ptrdiff_t值(与两个指针之间的差相对应的类型) (C99)"%td"
-项目是左对齐的,也就是说,会把项目打印在字段的左侧开始处"%-20s"
+有符号的值若为正,则显示带加号的符号;若为负,则带减号的符号。"%+3.2"
(空格)有符号的值若为正,则显示时带前导空格(但是不显示符号);若为负,则带减号符号。+标志会覆盖空格标志。"% 3.2"
#使用转换说明的可选形式。若为%o格式,则以0开始;若为%x和%X格式,则以0x或0X开始,对于所有的浮点形式,#保证了即使不限任何数字,也打印一个小数点字符。对于%g和%G格式,它防止尾随零被删除。"%#o"
0对于所有的数字格式,用前导零而不是用空格填充字段宽度。如果出现-标志或者指定了精度(对于整数)则忽略该标志。"%010d"
## 4.3 机器码求解
char c = 128;

此处是将一个int赋值给一个char类型变量,进行隐式类型转换.int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

首先,整型128在一个字长为4个字节的的原码为00000000 00000000 00000000 10000000,当把一个int类型赋值给一个有符号的char类型时,高位被舍弃。实际给c的是

关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 02:53 , Processed in 0.068300 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.