十六进制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
谁能解释一下十六进制 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