以下代码:
signed char sc = ~0xFC;
unsigned char uc = ~0xFC;
编译时给出了以下警告:
integer conversion resulted in truncation
integer conversion resulted in truncation
感谢名单,
我正在使用IAR Compiler for 8051,
在使用其他编译器进行编译时是否会收到类似的警告?
答案 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;