2017-01-21 1 views
-2

j'ai vu un code qui ressemble à ceci:Pourquoi 0xff égal à négatif 0 en C++

Object *area = new Object[n]; 
memset(area, 0xff, sizeof(Object) * count); 

Alors Remplit tous les champs de tableau d'objets avec le bit 1. Plus tard, il y a plusieurs endroits vérifier si le champ d'un objet n'a pas été rempli encore en vérifiant contre ~ 0 (zéro négatif):

const unsigned int NULL_INDEX = ~0; 
... 
if(object.field == NULL_INDEX) {...} 

Le champ de cette classe d'objets est de type unsigned int. Je suis confus que pourquoi 0xff peut être évalué pour être égal à ~ 0, sur int non signé? J'ai vu un autre post parler de 0xff est égal à -1 sur le système de complément de 2, et a trouvé un autre post qui je pense que cela signifie que si un programme C++ interprète 0xff pour être -1 ou ~ 0 dépend du système?

Quelle est exactement la manière portable en C++ de vérifier l'entier lorsqu'il est rempli avec 0xff? Cela devrait-il être vérifié par rapport à un int non signé ou à un int signé? Je suis tellement confus ...

+8

'~ 0' n'est pas négatif 0. –

+0

~ inverser chaque bit. – Phil1970

+1

Il n'y a pas de 0 négatif pour les entiers dans la représentation la plus commune (complément à 2). – Phil1970

Répondre

3
~0 

définit simplement tous les bits à 1. Par exemple, si vous avez 32 bits int et que vous utilisez

int all_the_ones = ~0; 

vous obtiendrez 11111111111111111111111111111111 dans la une partie de mémoire contenant la valeur de all_the_ones

0xff ensembles 8 bits à 1, de sorte que pour un 32bit int il serait 00000000000000000000000011111111

Quoi qu'il en soit, pour 0xff égale à ~ 0 sur un int, int en question devrait être 8bit/1byte, alias char

unsigned char a = ~0; 
signed char b = ~0; 

Donnerait un égal à 255 et b égal à -1

en mémoire, ils sont tous les deux 11111111

Je ne comprends pas pourquoi vous voulez savoir si 0xff a été stocké dans un entier, mais en comparant contre a ou b devrait fonctionner au-dessus.

+0

Merci, je viens de mal comprendre le signe entier lol ... – Superziyi

+0

heureux d'être d'aide ^^ – ScegfOd