2009-04-16 7 views
4

Je suis passé par k & r. Je problème d'avoir à comprendre les lignes suivantes à la page 197 (section A6)De plus grands nombres entiers à moins de conversions de type non signés en C

conversions intégrales: tout entier est converti en un type non signé donnée par trouver le plus petit non négatif valeur qui est conforme à cet entier , modulo un de plus que le plus grande valeur qui peut être représentée dans le type non signé.

Est-ce que n'importe quel corps peut l'expliquer avec un peu de détail? Merci

Répondre

6

tout entier est converti en un type donné non signé en trouvant la plus petite valeur non négative qui est congruente à cet entier, modulo un de plus que la plus grande valeur qui peut être représentée dans le type non signé.

Jetons ce bit par bit et de l'envers:

Quelle est la plus grande valeur qui peut être représentée dans le type non signé de bits largeur de n?

2^(n) - 1. 

Ce qui est un plus de cette valeur?

2^n. 

Comment la conversion a lieu?

unsigned_val = signed_val % 2^n 

Maintenant, la raison pour laquelle une partie: La norme ne précise pas ce que la représentation bit est utilisé. D'où le jargon. Dans la représentation du complément à deux - qui est de loin la plus utilisée - cette conversion ne change pas le modèle de bits (à moins qu'il y ait une troncature, bien sûr).

Reportez-vous à Conversions intégrales de la norme pour plus de détails.

6

Cela signifie que seuls les bits de faible valeur seront comptés et les bits de poids fort seront supprimés.

Par exemple:

01111111 11111111 11110000 00001111 

lorsqu'ils sont convertis en 16 bits unsigned short sera:

11110000 00001111 

Ceci est effectivement exprimé mathématiquement:

target_value = value % (target_type_max+1)   (% = modulus operator) 
Questions connexes