C语言中负数的补码的问题
发布时间:2025-05-12 03:48:40 发布人:远客网络
一、C语言中负数的补码的问题
谭浩强说的方法适用于数字位数小于字长的情况,也就是符号位不能被覆盖。像-127,只有在规定字长大于8位(含符号位)的情况下,才能适用。两种方法都可以。谭浩强写的很多东西都喜欢把简单的东西复杂化,让新手反而不理解了。最直观的理解方法就是方法1,负数符号位就是1,符号位不变,把去掉符号位后的绝对值部分取反,然后加1,就是负数的补码。
二、c语言选择题求解!
27.-48中的48换成二进制是110000,一个字节是八个字位,由于是负数最高位就是1,则-48的原码就是10110000,再换成反码最高位不变(还是1),其他位0->1,1->0,反码就是11001111,反码在加1变到补码就是11010000
28.区位码0915,前两位看作一组,后两位为一组,分别化成十六进制,(09)10->(09)16,
(15)10->(0F)16,在每组分别加20H,09->29,0F->2F,所以换成国际码就是292FH
29.[X]补=10110100,由于最高位是1,所以是负数换成原码就先减1,在将除第一位都将0换成1,1换成0,则[X]的原码就是11001100,可以看成-1001100,[Y]补=01101010,所以y是正数则原码就是补码,原码为01101010,那(x-y)=(-1001100-1101010)=-(1001100+1101010)=-10010110,而由于一个字节只有8个字位,而最高位又要表示正负,所以溢出了
30.这道题后面两个我不知道,00111001是反码,由于最高位是0,所以是正数反码就是原码,那00111001=2^5+2^4+2^3+2^1=57
31.这个就要自己算了,不过可以发现B、C选项都是76,由于十进制是是十个一进,八进制是八个一进所以B>C,(76)8=7*8+6=(62)10,又由于62比67小,十六进制又比十进制大,所以D>C
33.A5=10*16+5=165,(140)11=1*121+4*11=165
正数不管是原码还是反码还是补码都是一样,
负数不管是原码还是反码还是补码最高位都是1,
负数原码变反码除最高位其他的都1变0,0变1,
三、c语言中负数除法和右移的区别
对于无符号整数,除法和右移效果是一样的;
对于有符号的正整数,除法和右移的效果也是一样的;
对于有符号的负整数,除法和右移的效果是不一样的;
比如:-3/2=-1;-3>>1是多少呢?
我们可以将其按照8位二进制展开-3的8位二进制是1000 0011,负数在计算机中是以补码的形式存储的,所以还需要将其转换成补码1000 0011
转换成反码 1111 1100(最高位符号位不动),再加1转换成补码1111 1101
接着将其右移1位,由于是有符号负整数,所以最高位补1,变为1111 1110
接着将其还原成原码,1111 1110减1变反码1111 1101,接着反码取反变原码1000 0010,转换成十进制是-2,
其实这是因为除法是向0取整,而右移位是向负取整
-3/2=-1.5=-1(向0取整),-3>>1=-1.5=-2(向负取整);
如果我们需要右移达到的效果和除法一样,可以采取下列公式:
假设除数为2^N,负数x的除法可以用以下方法来代替:(x+ 2^N- 1)>> N
本文来自西门一雪的CSDN博客,全文地址请点击: