Je lisais la source de la bibliothèque PDF GNU, en particulier leur implémentation d'entiers 64 bits. Ils ont défini des entiers de 64 bits comme des structures de deux entiers de 32 bits - l'entier supérieur est signé et l'ordre inférieur int est non signé. Voici le code correspondant du fichier d'en-tête:Les nombres entiers négatifs de 64 bits sous forme de complément à deux
/*Definition of internal structure of the pdf_i64_t type*/
struct pdf_i64_s
{
pdf_i32_t high;
pdf_u32_t low;
};
typedef struct pdf_i64_s pdf_i64_t;
Selon les chiffres négatifs manuel d'architecture sont représentés dans deux la forme de complément. J'ai un doute au sujet de cette fonction si:
[code de pdf-types.c]
void pdf_i64_assign_quick (pdf_i64_t *bignum,
const pdf_i32_t value,
pdf_status_t *p_status)
{
ASSIGN_SAFE(p_status, PDF_OK);
if (bignum != NULL)
{
if (value < 0)
{
bignum->high = 0xFFFFFFFF;
}
else
{
bignum->high = 0;
}
bignum->low = value;
}
else
{
ASSIGN_SAFE(p_status, PDF_ERROR);
}
}
D'après ce que je lis, pour obtenir le complément à deux d'un certain nombre, vous devez inverser tous les bits et ajouter 1 à le résultat. Dans la fonction ci-dessus, pour la valeur < 0, ils ne font que mettre les bits de poids fort à 0xFFFFFFFF mais ne modifient pas du tout les bits de poids faible. Les bits de 'value' ne devraient-ils pas être inversés, suivi de l'addition de 1? Quelqu'un peut-il expliquer cela?
Merci.
Il convient de noter que ce code a un comportement indéfini, en affectant des valeurs hors de la plage d'un type entier signé à une variable de ce type. Au lieu de cela, il devrait attribuer '-1'. –