类型转换

问题描述:

有人能告诉我什么这行代码做类型转换

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

据我所知,它会检查的价值,如果它是远远大于16它将它转换成int型,如果是多少小于8也是一样。但是
& 0xFF*(a++)做什么?

+0

“_much_小” 是不是由计算机理解的术语。这是你理解的暗示'''并不意味着更小! – Shahbaz 2012-08-07 10:17:06

+0

编程符号与数学符号不同。基本上在每种语言中,每个符号可以表示与其他语言意义非常相关的东西。 – c00kiemon5ter 2012-08-07 10:17:12

据我所知,它会检查值

它不检查任何东西,它不喜欢数学的<<符号,意思是“更小”。为了打破这一行:

*(a++) = (int)((value >> 16) & 0xFF); 
  • >>shiftsvalue 16倍向右
  • &ands结果与0xFF,从而放弃一切到左边
  • 运算结果存储在a
  • 增加指针,使a指向某个“下一个”元素
+0

非常感谢我现在得到它。 – sin 2012-08-07 10:28:45

(值>> 16)

不,它不是更大。

It is shift right by 16 bits. 

但是,将其分割为2倍,使其比以前小得多。

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”和旁边的指针移动到下一个元素。

+0

非常感谢您对我现在了解的详细解释。 – sin 2012-08-07 10:26:21

+0

但a是一个指针,所以a = value/65536是无效的。它应该是* a – 2012-08-07 10:29:13

+0

'value'不是'a',因此您的示例中的不同语句不相似或不相同。 – reece 2012-08-07 10:45:10

考虑:

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 

因此,这是确保一个整数的字节在一个平*立形式(选择big endian作为字节格式)。

现在,:

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

我们:

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