【问题标题】:Hexadecimal printf C programming十六进制 printf C 编程
【发布时间】:2015-12-09 17:28:47
【问题描述】:

有人可以解释一下十六进制 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;
 }

【问题讨论】:

    标签: c hex printf


    【解决方案1】:

    在包含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&lt;&lt;=1。

    【讨论】:

      【解决方案2】:

      例如为什么第一行打印的是 100 而不是 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 打印到标准输出。


      你问:

      第二行中的“OR”运算符呢? x=0x9;printf("2:%x %x %x\n",x|3,x&3,x^3); 9 -> 1001 3 -> 0011,但是我们如何获得 B 作为 结果,据我所知,我们需要 11-> 1011 转换为十六进制并获得 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
      

      【讨论】:

      • 第二行的“OR”运算符呢? x=0x9;printf("2:%x %x %x\n",x|3,x&3,x^3); 9 -> 1001 3 -> 0011,但是我们如何得到 B 作为结果,据我所知,我们需要 11-> 1011 转换为十六进制并得到 B。我们如何从 XOR 运算符中得到 10?
      猜你喜欢
      • 2017-01-09
      • 2013-01-21
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2014-11-03
      • 2011-06-01
      • 2011-12-09
      相关资源
      最近更新 更多