你如何解释第 7 行收到警告,而不是第 5 行或第 6 行?
int main()
{
unsigned char a = 0xFF;
unsigned char b = 0xFF;
a = a | b; // 5: (no warning)
a = (unsigned char)(b & 0xF); // 6: (no warning)
a = a | (unsigned char)(b & 0xF); // 7: (warning)
return 0;
}
在 32 位架构(Windows PC)上编译时的 GCC 4.6.2 输出:
gcc -c main.c --std=c89 -Wall -Wextra -Wconversion -pedantic
main.c: In function 'main':
main.c:7:11: warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
如果这有助于您理解我的问题,我是这样看的(可能不正确!):
我想在 32 位机器上操作是在 32 位数字上完成的。由于unsigned char
适合 32-bit int
,因此运算结果为 32-bit int
。但由于 GCC 没有在第 5 行和第 6 行给出警告,我想还有其他事情发生:
第 5 行: GCC 认为 (uchar) OR (uchar) 永远不会大于 MAX(uchar),所以没有警告。
第 6 行: GCC 认为 (uchar) AND 0xF 永远不会大于 MAX(uchar),所以没有警告。甚至不需要显式强制转换。
第 7 行:基于上述假设:AND 不应该发出警告(从第 6 行开始),或者也不应该发出警告(从第 5 行开始)。
我想我的逻辑在那里的某个地方有问题。帮助我理解编译器的逻辑。