Bootstrap

csapp

x, y为int整型,ux,uy为无符号整型。x,y的值可能是,int类型取值范围内的任何一个数。
请问下列问题是否对所有符号要求的 x,y 都成立

  1. 已知 x < 0,可以得到 (x * 2) < 0

  2. 所有 ux 满足 ux >= 0

  3. 已知 `x & 7 == 7 ,可以得到(x << 30) < 0``

  4. 所有 ux 满足 ux >= -1

  5. 已知 x > y,可以得到 -x < -y

  6. 所有 x 满足 x * x >= 0

  7. 已知 x > 0 && y > 0,可以得到 x + y > 0

  8. 已知 x >= 0,可以得到 -x <= 0

  9. 已知 x <= 0,可以得到 -x >= 0

  10. 所有x 满足 (x | -x) >> 31 == -1

整型 灵魂拷问答案

  1. False, 反例:Tmin,也就是INT_MIN
  2. True, 无符号数一定大于0
  3. True, 向左偏移后,符号位为1,所以一定小于0
  4. False,有符号和无符号数在运算得时候,会自动讲有符号转换成无符号数。-1是最大的无符号数
  5. False, 反例:假设 x == 0, y == Tmin,x,y的相反数是x,y本身,所以后者不成立
  6. False
  7. False, Tmax + 1 == Tmin
  8. True
  9. False, 只有一个反例,那就是 x == Tmin
  10. False, 唯一反例,x == 0

 

6a7ecc79fa104e9299bb5c6815dd4880.png

 

 

int、float、double间的强制类型转换

在没有了解编码方面的细节前,我们对这个问题只能说知其然而不知其所以然。
int转换成float,数字不会溢出,但是可能被舍入。
int或float转换成double,因为double有比这两者都来得更大的范围,和更高的精度,所以能够保留精确的数值。
double转成float,范围会变小,有可能得到值正负无穷。由于精度也变小了,所以可能被舍入。
float或double转成int,值将会像零舍入。例如:1.999会变成1,-1.999会变成-1。值有可能溢出

;