有人可以告诉我这些代码行做了什么
*(a++) = (int)((value >> 16) & 0xFF) ;
*(a++) = (int)((value >> 8) & 0xFF) ;
*(a++) = (int)((value & 0xFF)) ;
我知道它会检查该值,如果它远大于16,则将其转换为int类型,如果它远小于8则执行相同的操作。但是什么呢
& 0xFF
和*(a++)
呢?
答案 0 :(得分:2)
我知道它会检查值
它没有检查任何东西,它不像数学中的<<
符号,意思是“小得多”。打破这一行:
*(a++) = (int)((value >> 16) & 0xFF);
答案 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