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
  • 为什么我会收到这些警告
  • 如何编写代码以避免收到这些警告(不使用#pragmas)
  • thanx

    我用的是8051的IAR编译器


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

    在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表示不会忽略警告。ITYM
    0xFFFFFF03
    (@32位),和最后一行的
    3
    。@保罗:我不确定
    int
    是否是32位的,因为根据维基百科的说法,8051是一个16位的体系结构。你的回答是不正确的,因为
    ~
    可以应用于任何整数类型,特别是
    char
    ,然后它返回一个
    char
    。不幸的是令人惊讶的是,C中没有像字符常量这样的文字,甚至
    '\0xx'
    符号也是
    int
    。所以你必须按照Jack在回答中提出的方法来获得字符常量,然后一切正常。的确,我指的是03而不是04,但我看到你现在已经解决了。