【问题标题】:Unsigned char c = 255 is "11111111" or not?Unsigned char c = 255 是否为“11111111”?
【发布时间】:2013-07-25 22:36:43
【问题描述】:

这是我的问题代码:

#include "stdio.h"

int main()
{
        char a = -1;
        unsigned char b = 255;
        unsigned char c = 0;
        if((~a) ==  c)
                printf("OK 1");
        else
                printf("bad 1");
        printf("\n");
        if((~b) ==  c)
                printf("OK 2");
        else
                printf("bad 2");
        printf("\n");
}

我希望这会打印出来:

OK 1

OK 2

但是,我得到好的 1 和坏的 2!

如果unsigned char b 是255(11111111),那么~b 应该是00000000。为什么它不等于c?

我在 Linux SUSE 上工作,使用 gcc。

【问题讨论】:

    标签: c binary char


    【解决方案1】:

    您被整数促销所困扰。当你这样做时:

    ~b == c
    

    bc 都被提升为 int。这意味着你真的在做:

    ~0x000000ff == 0
    

    最后比较:

    0xffffff00 == 0
    

    不匹配。它适用于您的第一种情况,因为您的 char 类型已签名,并在促销中得到扩展:

    ~a == c
    ~(-1) == 0
    ~0xffffffff == 0
    0 == 0
    

    【讨论】:

    • ~0x000000ff 不是 0xffffff00。它是 -0x100。
    • R.. 是对的。我只是在答案中显示位模式,考虑到这里发生的与 C 标准相关的微妙之处,这可能是一个糟糕的选择。
    【解决方案2】:

    由于标准整数提升:在表达式~b 中,操作数提升为int,可能类似于0x000000FF;结果是整数0xFFFFFF00

    您必须将结果转换回unsigned char

    if ((unsigned char)(~b) == c) /* ... */
    

    【讨论】:

    • @CarlNorum:在我的记法中,F 是第 256 个符号 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多