我很难以我很容易理解的方式找到关于这个主题的信息,所以我要求对我找到的内容进行审查。这都是关于转换和转换的。
在例子中我将提到:
(signed/unsigned) int bigger;
(signed/unsigned) char smaller;
截断 整数。 (更大->更小)
- 首先在 MSB 侧截断
更大
以匹配更小
大小。 - 其次,根据较小的类型将截断的结果转换为有符号/无符号。
如果较大的值太大而不适合较小的类型,则会导致未定义的行为(纠正我)。然而,我的规则应该适用于所有机器(也请纠正我)并且结果应该是可预测的。- 首先在 MSB 侧截断
加宽整数(更小->更大)
a)
signed char
->signed int
- 在较小的前面加上 MSB(1 或 0)以匹配较大的尺寸
- 转换为签名
b)
signed char
->unsigned int
- 在较小的前面加上 MSB(1 或 0)以匹配较大的尺寸。
- 转换为无符号
c)
unsigned char
->signed int
- 在前面加上 0 以匹配更大的尺寸
- 转换为签名
d)
unsigned char
->unsigned int
- 在前面加上 0 以匹配更大的尺寸
- 转换为无符号
我没有提到的可能会弹出的未定义/未指定行为在哪里?
最佳答案
整数转换永远不会产生未定义的行为(它可以产生实现定义的行为)。
到可以表示被转换值的类型的转换总是明确定义的:值只是保持不变。
到无符号类型的转换总是明确定义的:值取模 UINT_MAX+1(或目标类型允许的任何最大值)。
转换为无法表示正在转换的值的有符号类型会导致实现定义的值或实现定义的信号。
请注意,上述规则是根据整数值而不是位序列定义的。
关于c - 整数转换(缩小,扩大),未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273658/