【问题标题】:Type conversion类型转换
【发布时间】:2012-08-04 08:03:15
【问题描述】:

谁能告诉我这几行代码是做什么的

*(a++)  = (int)((value >> 16) & 0xFF) ;
*(a++)  = (int)((value >> 8) & 0xFF) ;  
*(a++)  = (int)((value & 0xFF)) ;

我知道它会检查值,如果它比 16 大得多,它会将其转换为 int 类型,如果它比 8 小得多,也会这样做。但是
& 0xFF*(a++) 有什么作用呢?

【问题讨论】:

  • muchsmall”不是计算机可以理解的术语。这是您理解<< 的提示并不意味着要小得多!
  • 编程符号不同于数学符号。基本上在每种语言中,每个符号都可以表示与在另一种语言中的含义非常无关的东西。

标签: c pointers int type-conversion


【解决方案1】:

(值>>16)

不,它并不大。

It is shift right by 16 bits.

但是将它除以 2 16 倍后,它比以前小得多。

val&0xff makes a solution if it is divisible by 256. For example: if val&0xff is different than zero, than it is not divisible by 256

【讨论】:

    【解决方案2】:

    我知道它会检查值

    它不检查任何东西,它不像数学中的 << 符号,意思是“小得多”。分解这一行:

    *(a++)  = (int)((value >> 16) & 0xFF);
    
    • (>>)shiftsvalue向右16次
    • (&) ands 得到0xFF 的结果,从而丢弃左边的所有内容
    • 将结果存储在a指向的地址
    • 增加指针,使a 指向某个“下一个”元素

    【讨论】:

      【解决方案3】:
      *(a++)  = (int)((value >> 16) & 0xFF) ; 
      

      就像:

      aIntValue = value/65536;
      aIntBalue = a%256;
      

      *(a++)  = (int)((value >> 8) & 0xFF) ;   
      

      就像:

      aIntValue = value/256;
      aIntValue = a%256;
      

      *(a++)  = (int)((value & 0xFF)) ; 
      

      就像:

      aIntValue = a%256;
      

      在代码的末尾,任一代码都将 aIntValut 分配给指向指针“a”的值,然后将指针移动到下一个元素。

      【讨论】:

      • 非常感谢您的详细解释我现在明白了。
      • 但是 a 是一个指针,所以 a=value/65536 是无效的。它应该是 *a
      • value 不是 a,因此您示例中的不同语句不相似或不等效。
      • 感谢 cmets:我已经更正了代码,我专注于解释位数学,我选择了不幸的变量名(与指针 XP 相同的名称)
      【解决方案4】:

      给定:

      char data[10];
      
      uint32_t value = 0x61626364; // 'abcd'
      
      char *a = data;
      *(a++) = (int)((value >> 24) & 0xFF);
      *(a++) = (int)((value >> 16) & 0xFF);
      *(a++) = (int)((value >> 8) & 0xFF);
      *(a++) = (int)(value & 0xFF);
      *(a++) = ':';
      *((uint32_t *)a) = value;
      a+=4;
      *(a++) = 0;
      
      printf("%s\n", data);
      

      我得到(在我的英特尔盒子上,这是一个小端系统):

      abcd:dcba
      

      所以这是为了确保整数的字节是独立于平台的形式(选择大端作为字节格式)。

      现在,为:

      *(a++) = (int)((value >> 16) & 0xFF);
      

      我们有:

      0x61626364 -- value
      0x00006162 -- value >> 16 : shifted 2 bytes
      0x00000062 -- (value >> 16) & 0xFF : last byte only
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多