当前位置:首页 » 编程软件 » 大一编译求整数的补码

大一编译求整数的补码

发布时间: 2022-04-18 19:39:59

1. 补码的整数补码

求给定数值的补码分以下两种情况: 正整数的补码是其二进制表示,与原码相同 。
【例1】+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。) 求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1 。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
【例2】求-5的补码。
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的补码是11111011。
【例3】数0的补码表示是唯一的。
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000 已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
【例4】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。 【例5】-65的补码是10111111
若直接将10111111转换成十进制,发现结果并不是-65,而是191。
事实上,在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。
若要得到一个负二进制补码的数值,只要对补码全部取反并加1,就可得到其数值。
如:二进制值:10111111(-65的补码)
各位取反:01000000
加1:01000001(+65)

2. 整数的补码怎么表示

整数的补码表示:
补码的最高位:0表示正数,1表示负数。

数据位:正数就是数值的二进制数;
负数是取原数绝对值的二进制数,每一位取反(0、1互换)后,末位加1。

3. 通常对一个整数的补码求补码将会得到该数的原码

是的,对一个整数的补码(按照从原码求补码的方法)再求一次补码将会得到该数的原码。
也可以用下面的简便方法:正数的补码不变;负数的补码,只要将这个补码中最左和最右的1保持不变,这两个1中间的每一位二进制数求反(0,1互换)就行。例如,补码
10100110的原码是11011010。

4. 大一计算机 使用补码表示模拟计算机十进制算试的计算过程,并验证结果是否正确98-89=

98 - 89 = ?
首先将减法变为加法:98 + (-89) = ?
其次进行转换,假定都是十六位补码,则 [98]补 = 0x0062,[-89]补 = 0xFFA7
再次进行加法运算,0x0062+0xFFA7 = 0x0009
因此计算结果为十进制的+9。
十六位补码的取值范围是-32768~+32767。

5. 求数的补码 c语言

简单的位运算就可以了
#include <stdio.h>

void printBin(int num){
int i,k=31;
for(i=0;i<32;i++){
printf("%d",(num>>k)&1);//移位并输出
k--;
}
printf("\n");
}

int main(int argc, char* argv[])
{
int num;
printf("Please input a number, I will tell you what it really is:");
scanf("%d",&num);
printf("It is binary display is:");
printBin(num);
return 0;
}

6. 补码的补码怎么求

求给定数值的补码表示分以下两种情况:
(1)正数的补码
与原码相同。
【例1】+9的补码是00001001。(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。)
(2)负数的补码
负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
同一个数字在不同的补码表示形式里头,是不同的。比方说-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。在这篇补码概述里头涉及的补码转换默认了把一个数转换成8位2进制的补码形式,每一种补码表示形式都只能表示有限的数字。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:-7的原码(10000111)→按位取反(11111000)(负数符号位不变)→加1(11111001)
所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
再举一个例子:求-64的补码
+64:01000000
11000000
【例3】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。
在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”
的概念:
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范
围,即都存在一个“模”。例如:
时钟的计量范围是0~11,模=12。
表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的
余数。任何有模的计量器,均可化减法为加法运算。
例如:
假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
一种是倒拨4小时,即:10-4=6
另一种是顺拨8小时:10+8=12+6=6
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特
性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8,
所能表示的最大数是11111111,若再
加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的
模为2^8。
在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以
了。把补数用到计算机对数的处理上,就是补码。
另外两个概念
一的补码(one's
complement)
指的是正数=原码,负数=反码
而二的补码(two's
complement)
指的就是通常所指的补码。
小数补码求法:一种简单的方式,符号位保持1不变,数值位从右边数第一个1及其右边的0保持不变,左边按位取反。
(3).补码的绝对值(称为真值)
【例4】-65的补码是10111111
若直接将10111111转换成十进制,发现结果并不是-65,而是191。
事实上,在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。
若要得到一个负二进制数的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。
如:二进制值:10111111(-65的补码)
各位取反:01000000
加1:01000001(+65的补码)
编辑本段代数加减运算
1、补码加法
[X+Y]补
=
[X]补
+
[Y]补
【例5】X=+0110011,Y=-0101001,求[X+Y]补
[X]补=00110011
[Y]补=11010111
[X+Y]补
=
[X]补
+
[Y]补
=
00110011+11010111=00001010
注:因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉,所以结果不是
100001010,而是00001010。
2、补码减法
[X-Y]补
=
[X]补
-
[Y]补
=
[X]补
+
[-Y]补
其中[-Y]补称为负补,求负补的方法是:负数的绝对值的原码所有位按位取反;然后整个数加1。
(恢复本来解释。请路人真正理解并实际验证后再修改。以免误导大众。另外,例6不具典型性,新增例7。)
【例6】1+(-1)
[十进制]
1的原码00000001
转换成补码:00000001
-1的原码10000001
转换成补码:11111111
1+(-1)=0
00000001+11111111=00000000
00000000转换成十进制为0
0=0所以运算正确。
【例7增】-7-(-10)
[十进制]
-7的补码:11111001
-10的补码:11110110
-(-10):按位取反再加1实际上就是其负值的补码,为00001010
-7
-
(-10)=
-7
+
10
=
3
11111001+00001010
=
00000011
转换成十进制为3
3、补码乘法
设被乘数【X】补=X0.X1X2……Xn-1,乘数【Y】补=Y0.Y1Y2……Yn-1,
【X*Y】补=【X】补×【Y】补,即乘数(被乘数)相乘的补码等于补码的相乘。
编辑本段补码的代数解释
任何一个数都可以表示为-a=2^(n-1)-2^(n-1)-a;
这个假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为:a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2),第(n-1)位为符号位不计算在内。
这里k0,k1,k2,k(n-2)是1或者0,而且这里设a的二进制位数为n位,即其模为2^(n-1),而2^(n-1)其二项展开是:1+2^0+2^1+2^2+……+2^(n-2),而式子:-a=2^(n-1)-2^(n-1)-a中,2^(n-1)-a代入a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2)两式,2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+……+(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1,而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反,而为什么要加1,追溯起来就是2^(n-1)的二项展开式最后还有一项1的缘故。而-a=2^(n-1)-2^(n-1)-a中,还有-2^(n-1)这项未解释,这项就是补码里首位的1,首位1在转化为十进制时要乘上2^(n-1),这正是n位二进制的模。
不能贴公式,所以看起来很麻烦,如果写成代数式子看起来是很方便的。
注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1)
--2^(n-1)
-1,所以模为2^(n-1)。上面提到的8位二进制模为2^8是因为最高位非符号位,表示的数值范围为0--2^8-1。

7. 用C语言编一个程序,使给出一个数的原码,求得反码,补码。

#include<stdio.h>

int main(){
int i,j,k;
int a[16], af[16], ab[16];//af存储反码,ab存储补码第0位为符号位
char b[16];
scanf("%s", b);
for(i = 0; b[i] != '\0'; i++){
a[i] = b[i] - '0';
}
j = i-1;
ab[0] = af[0] = a[0];//符号位始终不变

if(a[0] == 1){//当从屏幕输入的是负数,则作相应变换
for(i = j; i > 0; i--){
af[i] = 1 - a[i];
ab[i] = a[i];
if(a[i] == 1){
i--;
break;
}
}
k = i;
for(; i > 0; i--)
af[i] = 1 - a[i];
for(i = k; i > 0; i--)//补码从末位数起第一个不为0,以后均取反
ab[i] = 1 - a[i];
}
else{//如果是正数,则全部复制
for(i = j; i > 0; i--){//正数反码、补码都与原码相同
af[i] = a[i];
ab[i] = a[i];
}
}
printf("对应的反码是:\n");
for(i = 0; i <= j; i++)
printf("%d", af[i]);
printf("\n");
printf("对应的补码是:\n");
for(i = 0; i <= j; i++)
printf("%d", ab[i]);
}

在vc下编译测试通过。另,本代码未考虑输入非法问题,所输入的数字智能由1和0组成

8. 怎样用C语言编写一个实现求任意整数X的补码

正整数的补码就是它本身
负整数的补码就是它在内存中的存储值
#include
void
main()
{
int
n;
scanf("%d",
&n);
printf("n的补码:%x\n",
n);/*
16进制和2进制等价
*/
}
如果你的任意整数要求1000位数或者更大,那就要用数组来存储,并按照补码规则来计算:负数的补码就是对反码加一,而正数不变。

9. C中,编程求无符号整数的补码,请帮我分析一下这个程序,谢谢,请看补充:

这个程序用的是8进制。
输入数据 %o 是8进制
0100000 是8进制 常数。等于 十进制32768 , 等于 十六进制 0x8000

if(z==0100000) 判断符号位

正数的原码反码补码一样,就是自己
负数的补码是除符号位外的反码加1
无符号整数的补码 -- 费解。

10. 整数的原码,反码和补码的表示

原码表示:将符号位数码化了的数,其中“+”用0表示,“-”用1表示。
反码表示:正数的反码表示与原码表示一样;负数的反码表示是原码表示的符号位不变,数值位逐位取反。
补码表示:正数的补码表示与原码表示一样;负数的补码表示是原码表示的符号位不变,数值位逐位取反后最低位加1(反码表示最低位加1)。
例:
[+63]原=0111111
[+63]反=0111111
[+63]补=0111111
[-63]原=1111111
[-63]反=1000000
[-63]补=1000001

热点内容
内塔尼亚胡访问沙特 发布:2025-03-20 11:08:43 浏览:622
Android传输视频 发布:2025-03-20 11:06:34 浏览:149
java软件免费下载 发布:2025-03-20 10:26:01 浏览:705
安卓用什么编译 发布:2025-03-20 10:25:57 浏览:808
ftp中文软件下载 发布:2025-03-20 10:07:47 浏览:508
nexus7android 发布:2025-03-20 10:06:58 浏览:619
安舍iq8如何修改密码 发布:2025-03-20 10:06:17 浏览:880
解压RTP 发布:2025-03-20 09:59:37 浏览:161
python量化分析 发布:2025-03-20 09:53:05 浏览:626
手机热点有限的访问权限 发布:2025-03-20 09:50:46 浏览:440