整数转换(缩小,扩展),未定义的行为

zub*_*rgu 12 c integer type-conversion implicit-conversion

我很难以我能够轻易理解的方式找到关于这个主题的信息,所以我要求对我发现的内容进行审查.这只是关于转换和转换的.


在示例中,我将指的是:

(signed/unsigned) int bigger;
(signed/unsigned) char smaller;
Run Code Online (Sandbox Code Playgroud)
  1. 截断整数.(超大化>小)

    • 首先在MSB截断 以匹配大小.biggersmaller
    • 第二,根据较小的类型截断的结果转换为有符号/无符号.


    如果较大的值太大而不适合较小的类型,则会导致未定义的行为(纠正我).但是我的规则应该是在所有机器上工作(对此也是正确的),结果应该是可预测的.

  2. 加宽整数(小 - >更大)

    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为前缀以匹配更大的尺寸
    • 转换为无符号

哪些未定义/未指定的行为,我没有提到可以弹出?

n. *_* m. 19

积分转换永远不会产生未定义的行为(它可以产生实现定义的行为).

转换为可以表示转换值的类型始终是明确定义的:值只是保持不变.

转换为无符号类型始终是明确定义的:以UINT_MAX + 1(或目标类型允许的任何最大值)为模取值.

转换为无法表示正在转换的值的带符号类型会导致实现定义的值或实现定义的信号.

注意,上述规则是根据整数值定义的,而不是根据比特序列定义的.

  • 因此,从任何类型(有符号/无符号/更大/更小)到无符号的转换总是定义为`value%(转换为+1的类型的最大值)` (2认同)
  • @nm:标准不需要签名类型的二进制表示是什么意思?值位与无符号类型中的对应位相对应,恰好有一个符号位对值求反或值为 -(2^M) 或 -(2^(M)-1),并且可能有填充位。这怎么不是二进制表示呢?(当然,OP的符号扩展不适用于符号幅度表示) (2认同)