c位求反转换问题
以下代码:c位求反转换问题,c,casting,bit-manipulation,C,Casting,Bit Manipulation,以下代码: signed char sc = ~0xFC; unsigned char uc = ~0xFC; 编译时会给我以下警告: integer conversion resulted in truncation integer conversion resulted in truncation 为什么我会收到这些警告 如何编写代码以避免收到这些警告(不使用#pragmas) thanx 我用的是8051的IAR编译器 使用其他编译器编译时是否会收到类似的警告?在C语言中,算术运算的执
signed char sc = ~0xFC;
unsigned char uc = ~0xFC;
编译时会给我以下警告:
integer conversion resulted in truncation
integer conversion resulted in truncation
使用其他编译器编译时是否会收到类似的警告?在C语言中,算术运算的执行大小至少为
int
。这意味着,~0xFC
将返回一个int
。更重要的是,这个值是0xFF03
,远远超出了char
的范围(有无签名)
因此,作业将给出两个警告。你可以试试
signed char sc = ~0xFC & 0xFF;
查看编译器是否知道结果在char
范围内(添加&0xFF
后,gcc不会抱怨)。您还可以尝试添加显式强制转换:
signed char sc = (signed char)~0xFC;
// also possible:
// signed char sc = ~(signed char)0xFC;
或者,由于该值很容易计算,为什么不
signed char sc = 3;
因为十六进制文字在编写时被视为int,就像您编写的那样
0xFC
。。要避免出现警告,只需将其强制转换为仅将数字截断为1字节:
~((char) 0xFC)
0xFC
被认为是32位体系结构上的0x000000FC
,因此当您应用not时,您将获得0xFFFF03
,这意味着当您将此结果分配给字符时,3个最相关的字节将被丢弃,编译器会就此发出警告。+1表示不会忽略警告。ITYM0xFFFFFF03
(@32位),和最后一行的3
。@保罗:我不确定int
是否是32位的,因为根据维基百科的说法,8051是一个16位的体系结构。你的回答是不正确的,因为~
可以应用于任何整数类型,特别是char
,然后它返回一个char
。不幸的是令人惊讶的是,C中没有像字符常量这样的文字,甚至'\0xx'
符号也是int
。所以你必须按照Jack在回答中提出的方法来获得字符常量,然后一切正常。的确,我指的是03而不是04,但我看到你现在已经解决了。