我误解了指针ref/deref,指针算术还是领先0确实对C检测相等的能力产生了影响?

use*_*262 2 c hex pointers

我一直试图理解我用以下代码得到的错误

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);
}

    ......
Run Code Online (Sandbox Code Playgroud)

}

我的问题在于这个代码块以错误消息退出

bytes2bits: bad value 1010100
Run Code Online (Sandbox Code Playgroud)

我会一直以为0x01010100 == 1010100(注:fprintf中使用%x作为输出格式,所以我在看一个十六进制数字此外,当我测试并使用与%d输出格式printf的,我看到了.值16843008(= 16 ^ 6 + 16 ^ 4 + 16 ^ 2),这是0x01010100的等效的十进制表示.在"坏值" 1010100输出不受我的printf检查语句的存在下).

bytes2bits: bad value 1010100
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 5

这里唯一合理的猜测是,你的平台上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).