为什么(无符号短)0x8000 0001是1而不是65535?

时间:2019-07-05 04:36:03

标签: c casting

C 11 6.3.1.3,用于强制转换:

  

否则,如果新类型是无符号的,则通过重复添加或减去新类型所能代表的最大值,直到该值在新类型的范围内,来转换该值。

当我尝试

printf("%d", (unsigned short) 0x80000001);

我希望结果是65535,但我得到了1。 为什么在这种情况下返回1

2 个答案:

答案 0 :(得分:4)

  • 0x80000001 = 2147483649
  • unsigned short的最大值为65535。比65536多一个。
  • “通过反复转换该值...比最大值多一”。
  • 反复减去直到范围内的值(小于65536)与模数相同。
  • 2147483649 % 65536 = 1

但这是形式理论-实际上,这与简单地取0x80000001的最低16位(即值0x0001)相同。

答案 1 :(得分:2)

(unsigned short) 0x80000001,在OP中为65535。unsigned short 1根据引用的C 11 6.3.1.3转换为1。

根据{em>整数促销,int 1当然会转换为"%d",作为...函数的一部分。这与"1"和{{1}}相匹配。