0

有人可以告诉我这些代码行是做什么的吗

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

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

4

4 回答 4

2

我知道它会检查价值

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

*(a++)  = (int)((value >> 16) & 0xFF);
  • ( >>)向右移动16 次 value
  • ( &)将结果与相加0xFF,从而丢弃左边的所有内容
  • 将结果存储在指向的地址a
  • 增加指针,a指向某个“下一个”元素
于 2012-08-07T10:16:12.393 回答
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
于 2012-08-07T10:15:14.233 回答
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”的值,然后将指针移动到下一个元素。

于 2012-08-07T10:18:22.187 回答
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
于 2012-08-07T10:41:45.017 回答