C中较大的整数到较小的无符号类型转换

时间:2009-04-16 11:04:45

标签: c

我是通过k&河我在第197页(第A6节)

中理解以下几行时遇到了问题
  

积分转换:任何整数都是   转换为给定的无符号类型   找到最小的非负面   与此一致的价值   整数,模数比一个多   可以表示的最大值   在无符号类型中。

任何机构都可以详细解释一下。 感谢

2 个答案:

答案 0 :(得分:6)

这意味着只有低值位才会被计数,高位将被丢弃。

例如:

01111111 11111111 11110000 00001111
转换为16位unsigned short

将是:

11110000 00001111

这在数学上有效地表达为:

target_value = value % (target_type_max+1)           ( % = modulus operator )

答案 1 :(得分:6)

  

通过查找与该整数一致的最小非负值,将任何整数转换为给定的无符号类型,模数比可以在无符号类型中表示的最大值多一个。

让我们一点一点地从后面开始:

  

在无符号类型的宽度n位中可以表示的最大值是多少?

2^(n) - 1.
  

什么比这个值更重要?

2^n. 
  

转换是如何进行的?

unsigned_val = signed_val % 2^n

现在,原因部分:标准没有规定使用什么位表示。因此行话。在二进制补码表示中 - 这是迄今为止最常用的 - 这种转换不会改变位模式(当然,除非有截断)。

有关详细信息,请参阅标准中的积分转换。