C中较大的整数到较小的无符号类型转换
我是通过k&r进行的。 我在第197页(第A6节)中理解了以下几行的问题
积分转换:通过查找与该整数一致的最小非负值,将任何整数转换为给定的无符号类型,模数比可以在无符号类型中表示的最大值多一个。
任何机构都可以对此进行详细解释。 谢谢
通过查找与该整数一致的最小非负值,将任何整数转换为给定的无符号类型,模数比可以在无符号类型中表示的最大值多一个。
让我们一点一点地从后面看:
宽度为n位的无符号类型可以表示的最大值是多少?
2^(n) - 1.
什么比这个值更重要?
2^n.
转换是如何进行的?
unsigned_val = signed_val % 2^n
现在,原因部分:标准不强制使用什么位表示。 因此行话。 在二进制补码表示中 – 这是迄今为止最常用的 – 这种转换不会改变位模式(当然,除非有截断)。
有关更多详细信息,请参阅标准中的积分转换。
这意味着只有低值位才会被计数,高位将被丢弃。
例如:
01111111 11111111 11110000 00001111
转换为16位unsigned short
将是:
11110000 00001111
这在数学上有效地表达为:
target_value = value % (target_type_max+1) ( % = modulus operator )