十六进制printf C编程

Hexadecimal printf C programming

谁能解释一下十六进制 printfs 在这个程序中是如何工作的? 例如,为什么第一行打印 100 而不是 50?

#include <stdio.h>

 typedef struct 
 {
   int age;
   char name[20];g
 }inf;

 int main(int argc, char *argv[])
 {
     char m[]="Kolumbia",*p=m;
     int x,y;
     char* ar[]= {"Kiro","Pijo","Penda"};
     int st[] = {{22,"Simeon"}, {19,"Kopernik"}};

     x=0x80;y=2;x<<=1;y>>=1;printf("1:%x %x\n",x,y);
     x=0x9;printf("2:%x %x %x\n",x|3,x&3,x^3);
     x=0x3; y=1;printf("3:%x\n", x&(~y));

     printf("4: %c %c %s\n", *(m+1), *m+1, m+1);
     printf ("5: %c %s\n", p[3],p+3);
     printf ("6: %s %s \n", *(ar+1), *ar+1);
     printf("7: %c %c\n", **(ar+1), *(*ar+1));
     printf("8: %d %s \n",st[0].age, st[1].name+1);
     printf("9:%d %s\n",(st+1)->age,st->name+2);
     printf("10:%c %c %c\n",*(st->name),*((st+1)->name),*(st->name+1));

     return 0;
 }

在第一行包含一个 printf

x=0x80;y=2;x<<=1;y>>=1;printf("1:%x %x\n",x,y);

x 向左移动一次,赋予它 0x100.

的(双倍)值

这被打印为 100 因为 %x 格式没有预先添加 0x.

至于为什么它不打印 50 我只能想象你认为 x=0x80 正在分配一个十进制值 50h,也没有注意到 x<<=1.

For example why does the first line prints 100 instead of 50?

它不会打印 100 而不是 50,而是 80。您的初始值 x,在

中给出
x=0x80;(...)
// bits:
// 1000 0000

是十六进制的80,0x80,也就是十进制的128。 然后你将它向左移动 1

(...)y=2;x<<=1;(...)

等于乘以2。所以x变成256,十六进制0x100:

// bits:
// 1 0000 0000

然后您以十六进制格式打印它,省略 0x 并仅将 100 打印到标准输出。


您问的是:

What about the "OR" operator in the second line? x=0x9;printf("2:%x %x %x\n",x|3,x&3,x^3); 9 -> 1001 3 -> 0011, but how do we get B as a result, from what i see we need 11-> 1011 convert to hex and get B.

x=0x9;printf("2:%x %x %x\n",x|3,x&3,x^3);

这里:

x=0x9;
// 0000 1001

x|3:
// x: 0000 1001
// 3: 0000 0011
// |
// =: 0000 1011 = 0x0B , and here is your B

x&3
// x: 0000 1001
// 3: 0000 0011
// &
// =: 0000 0001 = 0x01

x^3
// x: 0000 1001
// 3: 0000 0011
// ^
// =: 0000 1010 = 0x0A