有人可以告诉我这些代码行是做什么的吗
*(a++) = (int)((value >> 16) & 0xFF) ;
*(a++) = (int)((value >> 8) & 0xFF) ;
*(a++) = (int)((value & 0xFF)) ;
我知道它会检查值,如果它比 16 大得多,它会将其转换为 int 类型,如果它比 8 小得多,也会这样做。但是
& 0xFF
and 有什么作用*(a++)
呢?
有人可以告诉我这些代码行是做什么的吗
*(a++) = (int)((value >> 16) & 0xFF) ;
*(a++) = (int)((value >> 8) & 0xFF) ;
*(a++) = (int)((value & 0xFF)) ;
我知道它会检查值,如果它比 16 大得多,它会将其转换为 int 类型,如果它比 8 小得多,也会这样做。但是
& 0xFF
and 有什么作用*(a++)
呢?
(值>>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
*(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”的值,然后将指针移动到下一个元素。
鉴于:
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