帮我解析一段C语言代码的原理
《狂人c》里面的代码,将10进制整数以2进制输出。问题有:1.为什么一个整数除以这个0x80000000(8进制,10进制为-2147483648,-2的31次方,64位...
《狂人c》里面的代码,将10进制整数以2进制输出。问题有:1.为什么一个整数除以这个0x80000000(8进制,10进制为-2147483648,-2的31次方,64位的最小int类型整数,这些我都懂了,2进制,8进制都学过了)就会输出它的二进制单个位数。2.为什么每输出一位就要用n%-2的31次方,并且-2的31次方要除以2?
展开
1个回答
展开全部
这里有一个基本假设:int 假定是32位,虽然常见的都是32位,但其实我们说整形,可以有16位,32位,64位,甚至无穷位。
为了方便讨论起见,我们 把 int 认为是 8 位 二进制 无符号数。(32位讨论自己类推)
那么
位 __8 _7 _6 _5 4 3 2 1 (对应位置一时表示的值如下)
值 256 64 32 16 8 4 2 1
我们知道八位二进制整数的表示范围 0 到 511。
所以 如果某个数 X⑧ 第八位是1,那么 这个数必定大于等于 256 = (2^7) = 2^(8-1) 【自己类比32位数】。因此如果 数 X⑧ / 256 的结果(0或者1)就可以表示第八位是0还是1。【也就得到了 X 的第八位】
接下来把 X⑧ 对 256 取模,变成一个 7 位 二进制数了, X⑦ = X⑧ % 256, (X⑦的第八位必定是0,取模256这个操作完整的保留了 X⑧ 的 低七位到 X⑦中)。因此取X⑦的第七位是0还是1就依照 X⑦ / 128 【也就得到了 X⑧ 的第七位】
X⑥ = X⑦ % 128 的第六位 X⑥/64【也就得到了 X⑧ 的第六位】
X⑤ = X⑥ %64 的第五位 X⑥/32【也就得到了 X⑧ 的第五位】
。。。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询