c按位否定转换问题

时间:2010-09-02 15:53:24

标签: c casting bit-manipulation

以下代码:

signed char sc = ~0xFC;
unsigned char uc = ~0xFC;

编译时给出了以下警告:

integer conversion resulted in truncation
integer conversion resulted in truncation
  1. 为什么我会收到这些警告
  2. 我如何编写代码,以便我不会收到这些警告(不使用#pragmas)
  3. 感谢名单,

    我正在使用IAR Compiler for 8051,

    在使用其他编译器进行编译时是否会收到类似的警告?

2 个答案:

答案 0 :(得分:6)

因为十六进制文字在写入时被认为是int 0xFC ..为了避免警告,只是强制它们将数字截断为仅1个字节:

~((char) 0xFC)

0xFC在32位体系结构上被视为0x000000FC,因此当您应用时不会获得0xFFFFFF03,这意味着当您将此结果分配给char时,3个最相关的字节只是被丢弃,编译器会警告你。

答案 1 :(得分:2)

在C中,算术至少以int的大小进行。这意味着,~0xFC将返回int。更重要的是,此值为0xFF03,超出了char(已签名或未签名)的范围。

因此,作业将给出两个警告。你可以试试

signed char sc = ~0xFC & 0xFF;

查看编译器是否知道结果在char范围内(gcc在添加& 0xFF后不会抱怨)。您还可以尝试添加显式强制转换:

signed char sc = (signed char)~0xFC;
// also possible:
// signed char sc = ~(signed char)0xFC;

或者,因为可以很容易地计算出值,为什么不只是

signed char sc = 3;