最佳答案
你的概念不正确,按位运算,只对内码进行操作,不管类型,而反码/补码是针对有符号整型的(符号位不变)
对负数按位取反,得到的是正数,它的符号位也会取反的
追问:
哦,内码是不是补码呢?-19的二进制 1 0010011 反码 1 1101100 补码 1 1101101 按位取反 0 0010010 9的二进制 0 0001001(原反补) 按位取反 1 1110110(教程上说是补码,还要计算出反原码,而上面负数计算出补码,取反就是值,为什么正数还要取反之后在计算)
追问:
就是按位取反之后的值,还要计算出反原码呢
追答:
个人觉得你的教程有点误导(当然,因为计算机是一门新型技术,没有绝对的权威和标准),我说的按位取反是从应用角度.它与补码/原码没有关系(C语言的~运算符)而在理论角度,正数的原码、反码与补码都是相同的只有负数才会去计算反码和补码一般的说法,反码中的按位取反,符号位是不变的(且现在除单片机,没有8位的了)
追答:
目前大家认可的说法,正数的原码、反码与补码是相同的,它不会计算原码、反码与补码你上面的9的二进制的原码、反码与补码都是 00001001
追问:
哦,那你能帮我用你的方法,计算出-19和9。按位取反之后的值吗?就像上面我那样。
追答:
若是实际的按位取反(8位的)Not(-19D) = 18D= 00010010BNot(9D) = -10D =11110110B这个无论是用微软的计算器,还是下列程序,都是相同的结果#includeint main(){ char x=-19,y=9; x=~x; y=~y; printf("%d %d\n",x,y); return 0;}
追问:
那个过程能不能写一下啊
追答:
过程与你的一样-19在计算机内部是用补码存储的,8位的二进制为11101101按位取反后值为00010010也就是十进制的18而9的话,二进制为00001001按位取反后值为11110110若是有符号的十进制就是-10当然,若是无符号的就是246另外,符号只是人为的规定,二进制的值才是真正内部值
最佳答案由网友 whoami1978 提供