在例子中我将指的是:
(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以匹配更大的大小
>转换为无符号
哪里有未定义/未指定的行为,我没有提到可以d出?
解决方法 积分转换不会产生未定义的行为(它可以产生实现定义的行为).转换为可以表示正在转换的值的类型始终被明确定义:该值保持不变.
对无符号类型的转换总是定义良好:该值被取为模UINT_MAX 1(或目标类型承认的任何最大值).
转换为无法表示正在转换的值的有符号类型导致执行定义的值或实现定义的信号.
注意,上述规则是以整数值而不是位序列来定义的.
总结以上是内存溢出为你收集整理的整数转换(缩小,扩大),未定义的行为全部内容,希望文章能够帮你解决整数转换(缩小,扩大),未定义的行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)