2008-11-04 4 views
12

Je lis Le langage de programmation C++ et Stroustrup indique que la valeur int d'un char peut aller de 0 à 255 ou de -127 à 127, selon l'implémentation. Est-ce correct? Il semble que cela devrait être de -128 à 127. Sinon, pourquoi leurs seules 255 valeurs possibles dans la deuxième possibilité d'implémentation, pas 256.plage pour les valeurs entières de caractères en C++

+0

Avez-vous une idée de la raison pour laquelle la plage d'entiers est comprise entre -128 et 127 et pas entre -127 et 128? – user1437027

Répondre

15

Vous êtes coincé dans two's complement penser - La norme C++ ne définit pas le représentation utilisée pour les nombres négatifs!

Si votre ordinateur (Dieu interdit) utilise ones's complement pour représenter des nombres négatifs, vous avez une plage de -127 à +127 dans un octet de 8 bits. A la hausse, vous avez deux représentations possibles différentes pour zéro ...

Cependant, dans le monde réel, you're unlikely to meet a one's complement computer.

+0

Bon point. J'avais oublié le compliment de 1: –

0

Merci Roddy et Esteban Brenes pour les réponses utiles.

Ceci est ma compréhension actuelle:

Il y a trois possibilités. Si les valeurs sont représentées comme non signées, un caractère sera compris entre 0 et 255. Si les valeurs sont représentées comme signées dans le complément à deux, un caractère va de -128 à 127. Enfin, si les valeurs sont représentées comme signées dans le complément , un char va de -127 à 127. Cette dernière possibilité suggère qu'il n'y aurait que 255 valeurs possibles contrairement aux 256 valeurs possibles pour les deux premières implémentations, mais cela ne prend pas en compte le zéro négatif dans les représentations du complément .

+0

Presque: non signé va de 0 à 255 et non pas 256. Je n'ai jamais travaillé sur une machine à complément de 1, donc exactement comment +0 et -0 travail est une conjecture. Je m'attendrais à une perspective C, vous ne pourriez jamais faire la différence – Roddy

+0

merci pour la correction – 108

3

Il est faux de penser qu'un char non signé est compris entre 0 et 255. C'est seulement sa portée minimale. un char doit avoir au moins 8 bits, et char signé, char non signé et char lui-même peut en effet avoir plus que 8 bits. alors cela signifie que char non signé pourrait aller au-delà de 255. bien que je reconnaisse que je n'ai pas eu une implémentation où il y avait plus de 8 bits, c'est théoriquement possible. cela est spécifié dans la norme c89 (sur laquelle C++ 03 bases), documentant les limites du fichier. h (CHAR_BIT, UCHAR_MAX, CHAR_MAX).

+0

Ceci est vrai. J'ai travaillé avec des processeurs DSP embarqués où char, short, int et long sont tous 32 bits. – ChrisN

1

Parce que la norme ne dit rien sur le type de char, "char" peut être:

  1. "unsigned char" (0-255) sur certains compilateurs (exemple: TexasInstruments compilateur pour leur ARM processeurs - série OMAP)

  2. "signed char" (-128 à 127) sur la plupart des compilateurs (gcc, MSVC ...)

Pour vous assurer que vous avez toujours une gamme bien définie, vous devriez utilisation "char signé" ou "char non signé".

Questions connexes