C语言中将较大的整数转换为较小的无符号类型

5

我正在阅读K&R,遇到了第197页(A6部分)以下内容理解上的问题:

整数转换:将任何整数转换为给定的无符号类型,方法是找到与该整数同余的最小非负值,模除可以在无符号类型中表示的最大值加一。

能否有人稍微详细地解释一下这个过程。谢谢。

2个回答

7

这意味着只有低位的比特将被计算,高位的比特将被丢弃。

例如:

01111111 11111111 11110000 00001111

当转换为16位的无符号短整型时,结果为:

11110000 00001111

这个可以用数学方式表示为:

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

6
任何整数被转换为给定的无符号类型,通过找到与该整数同余的最小非负值来实现,对于无符号类型可表示的最大值加一取模。
让我们逐字逐句地理解这句话,并从后往前看:
无符号宽度为n位的类型可以表示的最大值是什么?
2^(n) - 1.

这个值加一等于多少?
2^n. 

转换是如何进行的?
unsigned_val = signed_val % 2^n

现在,让我们来解释一下为什么会出现这种术语。标准并没有规定使用哪种位表示法,所以就有了这个术语。在二进制补码表示法中——这是最常用的表示法——这种转换不会改变位模式(当然,除非有截断的情况)。
请参阅标准中的整数转换部分以获取更多详细信息。

你可以举一个例子说明“与那个整数同余的最小非负值”吗? - L.S. Roth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接