c - 我是否误解了指针引用/取消引用、指针算术或领先的 0's really make a difference in C' 检测相等性的能力?

标签 c pointers hex

我一直在尝试理解我在使用以下代码时遇到的错误

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(即 case 0x01010100: a = 0xe0)这一事实?

最佳答案

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

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

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

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

相关文章:

c - gtk3 滚动窗口大小,调整大小后里面有 gtkbox 和按钮

grep - grep 命令的正则表达式前面的美元符号意味着什么?

colors - E421 : Getting color name not recognized in perfectly valid statement

c++ - 十六进制加减法

c - 访问 C 中现有函数的最佳实践?

c++ - 从/向文件读写 double

c - gdb 就像打印指向结构的指针

c - 分配内存块然后创建内存的逻辑子 block 并返回指向这些子 block 的指针

c++ - 在 C++ 中使用 unique_ptr 出错之前预期的类型说明符

c - 指针和写访问冲突