2012-08-07 201 views
0

有人能告訴我什麼這行代碼做類型轉換

*(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

回答

2

據我所知,它會檢查值

它不檢查任何東西,它不喜歡數學的<<符號,意思是「更小」。爲了打破這一行:

*(a++) = (int)((value >> 16) & 0xFF); 
  • >>shiftsvalue 16倍向右
  • &ands結果與0xFF,從而放棄一切到左邊
  • 運算結果存儲在a
  • 增加指針,使a指向某個「下一個」元素
+0

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

1

(值>> 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 
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」和旁邊的指針移動到下一個元素。

+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

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 

因此,這是確保一個整數的字節在一個平臺獨立形式(選擇big endian作爲字節格式)。

現在,:

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

我們:

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