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

标签 c integer type-conversion implicit-conversion

我很难以我很容易理解的方式找到关于这个主题的信息,所以我要求对我找到的内容进行审查。这都是关于转换和转换的。


在例子中我将提到:

(signed/unsigned) int bigger;
(signed/unsigned) char smaller;
  1. 截断 整数。 (更大->更小)

    • 首先在 MSB截断 更大以匹配更小大小。
    • 其次,根据较小的类型将截断的结果转换有符号/无符号


    如果较大的值太大而不适合较小的类型,则会导致未定义的行为(纠正我)。然而,我的规则应该适用于所有机器(也请纠正我)并且结果应该是可预测的。

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

我没有提到的可能会弹出的未定义/未指定行为在哪里?

最佳答案

整数转换永远不会产生未定义的行为(它可以产生实现定义的行为)。

到可以表示被转换值的类型的转换总是明确定义的:值只是保持不变。

到无符号类型的转换总是明确定义的:值取模 UINT_MAX+1(或目标类型允许的任何最大值)。

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

请注意,上述规则是根据整数值而不是位序列定义的。

关于c - 整数转换(缩小,扩大),未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273658/

相关文章:

c - 使用内联汇编交换两个整数变量

C 中的 Char 数组未初始化为空

python - 将 4 位整数转换为 boolean 列表

c - 传递参数使指针来自整数

java - 独特的随机整数生成器

c++ - Switch case 语句如何在内部实现或工作?

c++ - 通过 Gnuplot 的管道接口(interface)从 C/C++ 可视化

MYsql 将 int 连接到 varchar (未按预期工作)

python - 如何检查字符串是否代表数字( float 或整数)?

c++ - 将字符串数组转换为 int 数组