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 为模减少,这意味着如果 b
是 0x55
,a
确实会以 0xAA
结束。
但请注意,如果 unsigned char
比 8 位宽(这是完全合法的),您将得到不同的结果。为确保您将可移植地获得 0xAA
作为结果,您可以使用:
a = ~b & 0xff;
(在 unsigned char
为 8 位的平台上,按位和应该被优化掉)。
另请注意,如果您使用有符号类型,则结果是实现定义的。
关于c - 将 int 截断为 char - 它是否已定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881895/