‘壹’ c语言求原码的补码问题
必须要用无符号数,位运算的规定就是如此,你想,如果有符号是负数,用哪个来位运算,结果呢
进行与运算是判断该数是否最大的负数,注意补码的数值范围,负数比正数多一个,该数为最小负数,表示范围内没有对应的正数
‘贰’ 计算机c语言中 什么是补码,反码,如何转换
所谓反码就是1变0,0变1
补码表示正数时就是其本身,表示负数时是绝对值码取反后加1
比如:
十进制+10,表示成二进制数据是00001010,这也是十进制+10的补码
十进制-10,表示成二进制:
先求出十进制10的二进制表示00001010
求反:11110101
加1: 11110110 这就是补码表示的十进制-10
‘叁’ 1111111111110100在C语言怎么把补码转换成真值
这要看你算不算符号位。
正常情况下最高位是符号位,所以最高位不变,其余位数的二进制数-1(111111111110100-1=111111111110011)再取反,即000000000001100。
算上最高位符号位1,原码就是1000000000001100,对应10进制就是-12。
‘肆’ c语言:原码,反码 补码
1)原码表示
原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。
例如,X1=
+1010110
X2=
一1001010
其原码记作:
[X1]原=[+1010110]原=01010110
[X2]原=[-1001010]原=11001010
在原码表示法中,对0有两种表示形式:
[+0]原=00000000
[-0]
原=10000000
2)补码表示
机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。
例如,[X1]=+1010110
[X2]=
一1001010
[X1]原=01010110
[X1]补=01010110
即
[X1]原=[X1]补=01010110
[X2]
原=
11001010
[X2]
补=10110101+1=10110110
机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。
例如,[X1]=+1010110
[X2]=
一1001010
[X1]原=01010110
[X1]补=01010110
即
[X1]原=[X1]补=01010110
[X2]
原=
11001010
[X2]
补=10110101+1=10110110
(3)反码表示法
机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。
例如:X1=
+1010110
X2=
一1001010
[X1]原=01010110
[X1]反=[X1]原=01010110
[X2]原=11001010
[X2]反=10110101
反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。
例1.
已知[X]原=10011010,求[X]补。
分析如下:
由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机器数为负数,故有[X]补=[X]原十1,即
[X]原=10011010
[X]反=11100101+1
[X]补=11100110
例2.
已知[X]补=11100110,求[X]原。
分析如下:
对于机器数为正数,则[X]原=[X]补
对于机器数为负数,则有[X]原=[[X]补]补
现给定的为负数,故有:
[X]补=11100110
[[X]补]反=10011001+1
[[X]补]补=10011010=[X]原+1
[[X]补]补=10011010=[X]原
总结一下,原码(为负时,正时都不变)全部取反即得到反码,反码加
"1"就得到补码了,就是这么简单。
‘伍’ C语言中一个数补码和原码是如何进行计算的
一个简单的方式求补码那就是从原码的最右端开始找到第一个不为零的数(就是1)从下一个开始取反
如1001
1100的补码就是0110
0100,至于原码用10进制数依次除以2安顺序保留余数,知道商为零为止,那么最后依次的余数就是原码的最高位,倒数第2个余数就是原码的次高为,这样依次,知道第一个余数就是原码的最低位了
‘陆’ 二进制原码补码转换c语言源代码
输入任意整数,输出32位的补码。
输入其他,结束程序。
#include
int
main()
{
int
i,num=0;
char
s[33]={0};
while(1==scanf("%d",&num)){
for(i=0;i<32;i++){
s[i]=
(0x01
&
(num>>(31-i)))
?
'1'
:
'0'
;
}
printf("%s\n",s);
}
return
0;
}
‘柒’ C语言原码补码问题
你的这个是16的,我可以给你用8位解释一下(原理是一样的,我打起来比较方便~)
我们知道,8位二进制的补码表示范围是-128~127对吧。
而在计算机中数据都是以二进制补码进行存储的,那么-128的存储方式就是1000 0000,而它是没有原码和反码的,所以你不太能验证,对吧。
这是因为在计算机中,为了溢出特意定义的一个小玩意儿~
所以放到16来解释,它的最小值也是-32768。
但这已经是最小的数了,再减就会溢出……(理论上是这样的)
但是现实中的程序编译有一定的容错性,只要到了一定的计算机承认的位数就变成-1了。
这是因为计算机中的数好像一个轮回……
(我的计算机是32位的~)
经过实践验证了我说的东西……
如果你的程序要求指定了16位,那么就是-1,如果高于16位,就是 -32769。
‘捌’ C语言原码补码按位运算问题!
int类型一般是16位,比如1就是0000 0000 0000 0001,其中有符号数第一位是符号位,正是0,负是1;
-20转换为二进制按规则应该是 1000 0000 0001 0100;这个就是原码,但是计算机中不是这么存储的;
然后将符号位以外的这15位取反,得到,1111 1111 1110 1011;这个叫反码
之后再加上1,得到,1111 1111 1110 1100;这个是补码(计算机中存储的-20)
从一个二进制数反推回十进制,按相反的顺序计算即可.
位运算>>,就是向右位移一定位数,正数补0,负数补1;
所以-20>>3就是111 1111 1111 1110 1(左边补出3个1,右边的100丢失)
得到1111 1111 1111 1101,这个是补码,(计算机中的数)
减1得1111 1111 1111 1100,这个是反码;
取反得1000 0000 0000 0011,这个是原码;(方便我们识别的数)
也就是十进制的-3.