类型转换

时间:2012-08-07 10:13:28

标签: c pointers int type-conversion

有人可以告诉我这些代码行做了什么

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

我知道它会检查该值,如果它远大于16,则将其转换为int类型,如果它远小于8则执行相同的操作。但是什么呢  & 0xFF*(a++)呢?

4 个答案:

答案 0 :(得分:2)

  

我知道它会检查值

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

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

答案 1 :(得分:1)

(值GT;&GT; 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 :(得分:1)

*(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'的值,然后将指针移动到下一个元素。

答案 3 :(得分:1)

假设:

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