对我来说,以我可以轻松理解的方式找到有关该主题的信息非常困难,因此我要求对我所找到的内容进行审查。这都是关于转换和转换的。
在示例中我将提到:
(signed/unsigned) int bigger;
(signed/unsigned) char smaller;
-
截断整数。 (更大->更小)
- first truncate
bigger
on MSB匹配的一侧smaller
size.
- second, convert截断结果为签名/未签名取决于较小的类型。
如果较大的值太大而无法适应较小的类型,则会导致未定义的行为(请纠正我)。然而,我的规则应该适用于所有机器(也请纠正我)并且结果应该是可预测的。
-
Widening整数(较小->较大)
a) signed char
-> signed int
- 在较小的前面加上 MSB(1 或 0)以匹配较大的尺寸
- 转换为签名的
b) signed char
-> unsigned int
- 在较小的值前面加上 MSB(1 或 0)以匹配较大的尺寸。
- 转换为无符号
c) unsigned char
-> signed int
d) unsigned char
-> unsigned int
我没有提到的未定义/未指定的行为可能会出现在哪里?
整数转换永远不会产生未定义的行为(它可以产生实现定义的行为)。
到可以表示正在转换的值的类型的转换始终是明确定义的:值只是保持不变。
到无符号类型的转换始终是明确定义的:该值以 UINT_MAX+1(或目标类型允许的任何最大值)为模。
转换为无法表示正在转换的值的有符号类型会导致实现定义的值或实现定义的信号。
请注意,上述规则是根据整数值而不是根据位序列来定义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)