c - 将 int 截断为 char - 它是否已定义?

标签 c bitwise-operators integer-promotion

unsigned char a, b;
b = something();
a = ~b;

静态分析器提示最后一行被截断,大概是因为 b 在其位被翻转之前被提升为 int,结果将是 int 类型。

我只对提升的 int 的最后一个字节感兴趣 - 如果 b 是 0x55,我需要 a 是 0xAA。我的问题是,C 规范是否说明了截断是如何发生的,或者它的实现是否已定义/未定义?是否保证 a 将始终被分配我期望的值,或者它是否会在一致的平台上出错?

当然,在分配之前转换结果会使静态分析器静音,但我想知道首先忽略此警告是否安全。

最佳答案

C 标准为无符号类型指定了这一点:

A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.

在这种情况下,如果您的 unsigned char 是 8 位,这意味着结果将以 256 为模减少,这意味着如果 b0x55 a 确实会以 0xAA 结束。

但请注意,如果 unsigned char 比 8 位(这是完全合法的),您将得到不同的结果。为确保您将可移植地获得 0xAA 作为结果,您可以使用:

a = ~b & 0xff;

(在 unsigned char 为 8 位的平台上,按位和应该被优化掉)。

另请注意,如果您使用有符号类型,则结果是实现定义的。

关于c - 将 int 截断为 char - 它是否已定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881895/

相关文章:

c++ - 对重载整数构造函数的调用不明确

c - C在链表中查找字符串

c - var 和 &(*var) 有什么区别

c - 在 C 中的浏览器中生成按键

javascript - 我的按位逻辑有什么缺陷?

Javascript 和 PHP Xor 等价物

javascript - 理解本例中的按位运算

c++ - 面试问题中的这个位操作代码有什么问题?

c - 为什么我收到 "unresolved external"错误?

c - 在存在 unsigned int 和 signed int 的 C 表达式中,哪种类型将提升为哪种类型?