2010-08-05 17 views

risposta

15

Plain int è lo stesso signed è lo stesso di signed int

+0

Alcuni (tutti?) I compilatori dispongono di un'opzione che consente di modificare l'impostazione predefinita in non firmata. In MSVC, è/J. –

+1

FYI Il compilatore CCS per i controllori PIC Microchip è senza segno di default. Argh! – kenny

+9

L'opzione del compilatore/J ha effetto su char, non su int. "char" può o non può essere firmato. "char", "signed char" e "unsigned char" sono sempre tipi distinti, anche se "char" è firmato o meno. –

2

int s sono firmati per impostazione predefinita.

12

C++ standard 3.9.1/2:

Ci sono quattro tipi interi firmati: “long int” “signed char”, “short int”, “int”, e < ...>

C++ standard 3.9.1/3:

Per ciascuno dei tipi interi firmati, c'e xists una corrispondente (ma differente) senza segno tipo intero: “char”, “unsigned short int”, “unsigned int”, e “unsigned long int,” < ...>

Quindi, sizeof(int) è uguale a sizeof(unsigned). Ma boost::is_same< int, unsigned >::value è falso.

+1

+1 per la citazione di Standard. – Cumbayah

1

signed int è lo stesso di int e specifica un valore intero che può avere valori sia positivi sia negativi.

unsigned int d'altra parte può solo avere valori positivi, quindi il più alto valore positivo è molto maggiore di quello di uno signed int.

+0

In realtà il * intervallo * di valori è esattamente della stessa dimensione, è appena spostato in modo che il valore minimo sia 0. –

+0

Hai ragione, quella era una scelta scadente di parole. Risolto;) –

3

ints sono firmati per impostazione predefinita, come lo sono longs.

Quindi, int, signed e signed int sono la stessa cosa.

Analogamente long e signed long sono gli stessi.

chars d'altra parte, non ha un valore predefinito. Le implementazioni possono considerarle firmate o non firmate (molti hanno un interruttore a linea di comando da scegliere). char, signed char e unsigned char sono considerati tre tipi distinti per la risoluzione di sovraccarico, l'instanazione di modelli e altri luoghi.

+0

L'ultima frase è troppo limitata. Non è solo la risoluzione del sovraccarico, è ovunque. Per esempio. anche come argomenti del modello.Quindi 'std :: vector ' è dello stesso tipo di 'std :: vector ', ma 'std :: vector ' è ** non ** lo stesso tipo di 'std :: vector ' – MSalters

+0

@MSalters: Buon punto, aggiornato. –

Problemi correlati