2017-08-11 2 views
2

Si mon code c est:Conversion explicite de type en C sur un niveau peu

unsigned char Buffer[4] = { 0, 0, 0, 0}; 
unsigned long Odometer = 0xff00ff00; 

Buffer[3] = Odometer & 0xff; 

Odometer = Odometer >> 8; 
Buffer[2] = (unsigned char)(Odometer & 0xff); 

Odometer = Odometer >> 8; 
Buffer[1] = (unsigned char)(Odometer & 0xff); 

Odometer = Odometer >> 8; 
Buffer[0] = (unsigned char)(Odometer & 0xff); 

Ce qui se trouve dans chaque indice de tampon? Je ne suis pas sûr de savoir comment le casting de type fonctionnerait au niveau des bits. Transfère-t-il l'octet le plus significatif ou l'octet le moins significatif de Odometer dans chaque index Buffer?

+0

'Buffer [3]' contient l'octet le moins significatif de '' Odometer' et tampon [0] 'le plus significatif. –

+0

@ 眠 り ネ ク ク en fonction de endianes mon ami :) –

+0

Ce code est endianess-indépendant donc Buffer contiendra [0] = octet MS, ... [3] = LS octet, simple comme ça. – Lundin

Répondre

5

Pour Buffer[3] est stocké

Buffer[3] = Odometer & 0xff; 

masque entre derniers 8 bits 0xff00ff et 0xff


Ensuite, vous passez Odometer 8 bits à droite de sorte que vous obtenez 0x00ff00ff


à Buffer[2] est stockée

Buffer[2] = Odometer & 0xff; 

masque entre derniers 8 bits 0x00FF00 ff et 0xFF


et le masque entre

0xff & 0x00 == 0x00 

tandis

0xff & 0xff == 0xff 

donc résultat est

Buffer[3] = 0x00; 
Buffer[2] = 0xff; 
Buffer[1] = 0x00; 
Buffer[0] = 0xff; 

Bitwise

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1 

si 0x00 & 0xff ressemble que

|0|0|0|0|0|0|0|0| 
|1|1|1|1|1|1|1|1| 
----------------- 
|0|0|0|0|0|0|0|0| <-- res 
&

tandis que 0xFF 0xFF ressemble que

|1|1|1|1|1|1|1|1| 
|1|1|1|1|1|1|1|1| 
----------------- 
|1|1|1|1|1|1|1|1| <-- res 
+0

Vous avez une expérience de plus de 30 ans? Shift est fait avec 'SHR'. [Lire ici] (https://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate). _ et les espaces sont toujours remplis de zeros_, donc vous pouvez annuler ce vote :-) @PeterJ –

+0

@PeterJ Supprimer le commentaire mais pas le downvote après votre propre erreur? Faire des espaces réservés? Je ne pense pas que la personne qui programme plus de 30 ans devrait faire ceci. –