我很难找到关于这个问题的信息,我可以很容易地理解,所以我要求我回顾一下我发现的内容.这只是关于转换和转换的.
在例子中我将指的是:
(signed/unsigned) int bigger; (signed/unsigned) char smaller;
>截断整数. (超大化>小)
>首先在MSB侧截断更大以匹配较小的大小.
>第二,根据较小的类型将截断的结果转换为signed / unsigned.
如果较大的值太大而不适合较小的类型,则会导致未定义的行为(纠正我的错误).然而,我的规则应该在所有机器上工作(也要纠正我),结果应该是可以预测的.
>扩大整数(较小 – >较大)
a)签名字符 – >签名int
>使用MSB(1或0)预加小以匹配较大的尺寸
>转换为签名
b)签名字符 – > unsigned int
>使用MSB(1或0)预加小以匹配较大的尺寸.
>转换为无符号
c)unsigned char – >签名int
>前缀为0以匹配更大的大小
>转换为签名
d)unsigned char – > unsigned int
>前缀为0以匹配更大的大小
>转换为无符号
哪里有未定义/未指定的行为,我没有提到可以弹出?
解决方法
积分转换不会产生未定义的行为(它可以产生实现定义的行为).
转换为可以表示正在转换的值的类型始终被明确定义:该值保持不变.
对无符号类型的转换总是定义良好:该值被取为模UINT_MAX 1(或目标类型承认的任何最大值).
转换为无法表示正在转换的值的有符号类型导致执行定义的值或实现定义的信号.
注意,上述规则是以整数值而不是位序列来定义的.