建设好网站怎么付费推广,成都网站设计制作公司,上海网站开发建设,深圳龙华区是不是很偏最近在《深入理解计算机系统》上看到一道题#xff0c;分享一下#xff1a;假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移#xff0c;而对于无符号值使用的是逻辑右移。变量的声明和初始化如下#xff1a;int x foo(); //任意值in…最近在《深入理解计算机系统》上看到一道题分享一下假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移而对于无符号值使用的是逻辑右移。变量的声明和初始化如下int x foo(); //任意值int y bar(); //任意值unsigned ux x;unsigned uy y;对于下面每个C表达式1)证明对于所有的x和y值它都为真(等于1)或者2)给出使得它为假(等于0)的x和y的值(x 0) || (x-1 0)假。设x等于Tmin32(32位有符号补码的最小值-2147483648)那么x-1必定负溢出等于Tmax32(32位有符号补码的最大值2147483647)此时表达式等于0。(x 7) ! 7 || (x 29 0)真。如果表达式(x7)!7的值为0则x低3位为二进制为111。在32位机器上左移29位时此时最高位符号位正好为1必定小于0。(x*x) 0有符号补码乘法是先将补码按照无符号数相乘再截断后将无符号数转成补码得到乘积。所以只要乘积截断之后最高位为1就不成立。比如当x为65535(0xffff)时x*x为-131071(0xfffe0001)x0 || -x 0真。如果x大于等于0则-x小于等于0。因为32位补码的表示范围为-2147483648~2147483647。每一个正数都有对应的负数。x 0|| -x 0假。如果x小于等于0设x为Tmin32(32位有符号补码的最小值-2147483648)。Tmin32的负数等于其本身没有正数与之对应。xy uy ux真。补码和无符号加法有相同的位级行为。x,y转为ux,uy只是数值变化二进制位并无变化。另外,xy虽然会有正溢出或负溢出uyyu也有正溢出但是他们在二进制位上都是一样的。进行比较之前会将有符号补码x和y的结果转换成无符号数。所以比较结果为1。x*~y uy * ux -x真。利用C语言按位取反的特性~y-y-1。代入表达式有x*-y-xuy*ux。又因为x*y等于ux*uy所以表达式只剩余-x。