L’opérateur de décalage en C ajoute des préfixes aux zéros

Voici le code:

#define u8 char #define u32 unsigned int typedef struct { //decoded instruction fields u8 cond; // Condition (f.ex. 1110 for always true) u8 instruction_code; // Is a constant since we only use branch u32 offset; // Offset from current PC } dcdinst; u8 mem[1024]; mem[0x0] = 0b11101010; u8* instruction_addr = &mem[pc]; if (instruction_addr == NULL) { return false; } unsigned int first_part = instruction_addr[0]; // Here is the code that presents a problem: // I try to get the upper part of the first byte inst.cond = first_part >> 4; 

first_part est l’octet suivant: 11101010. inst.cond devient 11111110, mais j’ai besoin que ce soit 00001110.

Donc, mon problème actuel est que je veux obtenir les 4 premiers bits de mon instruction qui commence à l’adresse instruction_addr . J’ai essayé de le faire en utilisant l’opérateur de décalage de droite >> mais le problème est qu’au lieu de préfixer des 0 à gauche de l’octet, il préfixe des 1.

J’ai trouvé sur stackoverflow que je devais d’abord first_part la valeur en une valeur non signée. C’est ce que j’ai fait en utilisant la variable first_part , mais j’ai toujours le même problème. Je ne comprends pas pourquoi le décalage semble “voir” ma variable comme une variable négative alors que son type est spécifiquement “non signé”.

Est-ce que quelqu’un a une idée?

Votre type u8 utilise char sans spécifier la signature, ce qui signifie qu’il a une signature indéfinie. Il est probable que votre compilateur utilise un caractère signed char par défaut. Ainsi, vous êtes soumis à une extension de signe pendant les opérations et pendant la promotion.

Changement:

 #define u8 char #define u32 unsigned int 

à:

 typedef unsigned char u8; typedef unsigned int u32; 

(ou utilisez les types stdint.h correctement) et votre espace de stockage doit être réellement non signé.

L’utilisation de typedef s signifie également que le compilateur est impliqué dans ce crénelage, ce n’est pas simplement un remplacement de texte du préprocesseur, éliminant ainsi une classe d’erreurs subtiles.