switch (c = fgetc( FileStream ))
  {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
        
  l = (l << 4) + c - '0';
  break;
          
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
        
  l = (l << 4) + c - 'A' + 10;
  break;是一个16进制的文件~
问题1:为什么要左移四位?2:-‘0’什么意思?
如果FileStream中保存有C76FAE8B字段那l等于多少?

解决方案 »

  1.   

    1. 左移4位相当于乘以16 (左移1位相当于乘以2)
    2. c-'0',因为从文件里取得都是字符,两个字符的ascii码相减,如果c='1',减得的结果就是式进值数1,就可以把该结果用于相加了,所以程序里当c='0','1'...'9'时减'0',当c='A','B'...'F'时减'A'的ascii码值再加10,就得到对应的十进制数了
      

  2.   

    刚才没写清楚,补充:
     int c;
     int l = 0;
    我是这样理解的:因为c和l都是int型的所以是16位所以l初始是l=0000000000000000,(l << 4) + c如果c = 5就是0000000000000101那(l << 4) + c = 0000000000000101,但是'0'=00110000,那l = (l << 4) + c - '0'中的l等于多少?
      

  3.   

    注意了,c是不会等于5的,c只可能等于'5',也就是一个ascii字符,转换成int就是53,而'0'转换成int就是48,至少,如果c是'5',那么c - '0' 就是5,这么说来,你可以这么理解:l=l*16+c,当然,这个c是指你能理解的数字,在我的例子中就是5了。这样就可以这么理解这段代码的含义:
    从文本文件中读取一串数字,比如说C76FAE8B,你用了一个l这个变量来保存,可以看出,l至少需要4个字节,也就是一个long int。
    起初l为0,然后读取'C',转换成数字12放到l中,本来'C'应该在最高位的,但是经过一次以后C在l中在最低位。这个时候l=0000000C。
    再进行第二次,读取'7',转换成数字7,将l左移4位后加7,这个时候l=000000C7。
    第三次,读取'6',转换成数字6,继续,l=00000C76
    第四次,读取'F',转换成数字15,继续,l=0000C76F
    ....
    第七次,读取'8',转换成数字8,继续,l=0C76FAE8
    第八次,读取'B',转换成数字11,继续,l=C76FAE8BOk