我一直在尝试理解以下代码的错误

bytes2bits(p,q,pixels)
u_char *p, *q;
register u_int pixels;
{
  register u_char *r, a;
  register u_long *l;

   ...

switch (*l++) {
    case 0x00000000:    a = 0x00; break;
    case 0x00000001:    a = 0x10; break;
    case 0x00000100:    a = 0x20; break;
    case 0x00000101:    a = 0x30; break;

    case 0x00010000:    a = 0x40; break;
    case 0x00010001:    a = 0x50; break;
    case 0x00010100:    a = 0x60; break;
    case 0x00010101:    a = 0x70; break;

    case 0x01000000:    a = 0x80; break;
    case 0x01000001:    a = 0x90; break;
    case 0x01000100:    a = 0xa0; break;
    case 0x01000101:    a = 0xb0; break;

    case 0x01010000:    a = 0xc0; break;
    case 0x01010001:    a = 0xd0; break;
    case 0x01010100:    a = 0xe0; break;
    case 0x01010101:    a = 0xf0; break;

    default:
      (void) fprintf(stderr,"bytes2bits: bad value %x\n",*--l);
      exit(1);
}

    ......

}

我的问题在于,此代码块随错误消息退出
bytes2bits: bad value 1010100

我本以为0x01010100 == 1010100(注意:fprintf使用%x作为输出格式,所以我正在查看一个十六进制数。此外,当我测试并使用具有%d输出格式的printf时,我看到值16843008(= 16 ^ 6 + 16 ^ 4 + 16 ^ 2),这是等效的十进制表示形式0x01010100。“错误值” 1010100的输出不受我的printf检查语句的影响。
bytes2bits: bad value 1010100

我怎么能理解switch语句不能将1010100识别为倒数第二种情况(即case 0x01010100:a = 0xe0)?

最佳答案

唯一合理的猜测是,在您的平台上,您使用u_long分析的switch比您实际打印的int / unsigned int长。

例如,如果u_long是64位类型,而int是32位类型,则您的*l++可能会评估为0xBAADF00D01010100。这显然与case 0x01010100:标签不匹配。但是,当您使用printf说明符执行%x时,您仅打印尾随的0x01010100部分。

在格式说明符(l%lx等)中使用%ld前缀来打印long值,以避免将来出现此类混淆(假设u_long基于long)。

关于c - 我是误解了指针ref/deref,指针算术还是领先的0's really make a difference in C'能够检测相等性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11437659/

10-14 13:07