我们在一个 int 类型值为 32 位的机器上运行程序。这些值以补码形式表示,而且它们都是算术右移的。unsigned类型的值也是 32 位的。 我们产生随机数x和 ,并且把它们转换成无符号数,显示如下: /* Create some arbitrary values */ int x = random : int y = random(); /* Convert to unsigned */ unsigned ux = (unsigned)xi unsigned uy= (unsigned) v: 对于下列每个 C表达式,你要指出表达式是否总是为 1。如果它总是为 1,那么请描述其中的数学原理。否则,列举出一个使它为 0的参数示例 A,(x<y)==(-x>-y) B.((x+y)<<4)+y-x==17*y+15*x C.x+~y+l==(x+y) D.(ux-uy)==-(unsigned)(y-x) E.((x>>2)<<2)<=x
时间: 2024-04-26 21:20:15 浏览: 116
求32位机器上unsigned int的最大值及int的最大值的解决方法
5星 · 资源好评率100%
A. (x < y) == (-x > -y)
这个表达式不一定总是为 1。当 x 和 y 的符号相同时,该表达式为真。但是,当 x 和 y 的符号不同时,该表达式为假。例如,当 x = 1,y = -2 时,左边为假,右边为真。
B. ((x + y) << 4) + y - x == 17 * y + 15 * x
这个表达式总是为 1。这是因为左边可以简化为 16x + 16y + y - x,即 15x + 17y,右边可以简化为 15x + 17y,两边相等。
C. x + ~y + 1 == x + y
这个表达式总是为 1。这是因为 ~y + 1 等于-y,所以左边可以简化为 x - y + y,即 x,右边可以简化为 x + y,两边相等。
D. (ux - uy) == -(unsigned)(y - x)
这个表达式总是为 1。这是因为无符号整数的减法是模运算,即如果 a < b,则 a - b + 2^n = a + 2^n - b,其中 n 是整数的位数。因此,左边可以简化为 x + 2^32 - y,右边可以简化为 x + 2^32 - y,两边相等。
E. ((x >> 2) << 2) <= x
这个表达式总是为 1。这是因为将 x 右移 2 位,然后左移 2 位得到的值一定小于等于 x,因为右移操作会将 x 的后两位舍弃,左移操作会在右边补上两个 0。
阅读全文