本文根据 http://blog.regehr.org/ A Quiz About Integers in C 整理而成
Q1:表达式 1 > 0 的值是?
A)0
B)1
C)undefined
A1: B。这是热身运动
Q2:表达式 1U > -1 的值是?
A)0
B)1
C)undefined
A2:A。无符号与有符号比较时,有符号的会转换为无符号。所以表达式等同于1与UINT_MAX比较,结果当然是0。
Q3:表达式 (unsigned short)1 > -1的值是?
A)0
B)1
C)undefined
A3:B。在这种情况下,比较是按有符号进行的。C会优先做算术比较,前提是无符号转换到有符号不会改变其算术值。
Q4:表达式 -1L > 1U的值的x86-64就多少?的0x86上是多少?
A) 都是0
B) 都是1
C) x86-64上是0,x86上是1
D) x86-64上是1,x86上是0
A4:C。在x86-64上,long类型长度要比int长,所以1U被转换为1L,-1L > 1L结果当然是0. 而x86平台上,long与int相同,上面的比较等同于UINT_MAX > 1U, 结果为1。
Q5:表达式 SCHAR_MAX == CHAR_MAX 的值是?
A) 0
B) 1
C) undefined
A5:B。char默认是有符号的。
Q6:表达式 UINT_MAX + 1 的值是?
A)0
B)1
C)INT_MAX
D)UINT_MAX
E)undefined
A6:C标准规定它等于0
Q7:表达式 INT_MAX + 1 的值是?
A)0
B)1
C)INT_MAX
D)UINT_MAX
E)INT_MIN
F)undefined
A7:有符号整数溢出的行为未定义
Q8:表达式 -INT_MAX 的值是?
A)0
B)1
C)INT_MAX
D)UINT_MAX
E)INT_MIN
F)undefined
A8:INT_MIN并不等于INT_MAX的负数
Q9:假设x是int类型,表达式 x<<0 是?
A)define for all values of x
B)取决于x
C)与x无关
A9:B。负数是不能左移的,即使是移0。
Q10:假设x是int类型,表达式 x<<1 是?
A)define for all values of x
B)取决于x
C)与x无关
A10:B。C99定义,负数是不能左移的。
Q11:假设x是int类型,表达式 x<<31 是?
A)define for all values of x
B)取决于x
C)与x无关
A11:B。
Q12:假设x是int类型,表达式 x<<32 是?
A)define for all values of x
B)取决于x
C)与x无关
A12:C。C99 定义,所有超过可操作范围的位移都是错误。
Q13:假设x是short类型,表达式 x<<29 是?
A)define for all values of x
B)取决于x
C)与x无关
A13:x被转换到整形,因此不会操作越界。
Q14:假设x是unsigned类型,表达式 x<<31 是?
A)define for all values of x
B)取决于x
C)与x无关
A14:A。无符号的操作范围是32位
Q15:假设x是unsigned short类型,表达式 x<<31 是?
A)define for all values of x
B)取决于x
C)与x无关
A15:B。unsigned short被晋升为int是,它的最高位可能被当成符号位,从而改变其bit形式
Q16:假设x是int类型,表达式 x+1 是?
A)define for all values of x
B)取决于x
C)与x无关
A16:B。注意,当x是INT_MAX.
Q17:假设x是int类型,表达式 x-1+1 是?
A)define for all values of x
B)取决于x
C)与x无关
A17:B。注意,当x是INT_MIN.
Q18:假设x是int类型,表达式 (short)x+1 是?
A)define for all values of x
B)取决于x
C)与x无关
A18:A。向下转换时,没有歧义。
Q19:假设x是int类型,表达式 (short)(x+1) 是?
A)define for all values of x
B)取决于x
C)与x无关
A18:B。
Q20:表达式 INT_MIN % -1 的值是?
A)谁知道呢
A20:A。虽然它的值不是未定义,但确实不利于人们理解。