Wat is het verschil tussen ondertekend en niet-ondertekend int?
Antwoord 1, Autoriteit 100%
Zoals u waarschijnlijk weet, worden int
S inwendig in binair mogelijk opgeslagen. Typisch bevat een int
32 bits, maar in sommige omgevingen kunnen 16 of 64 bits (of zelfs een ander nummer, meestal maar niet noodzakelijk een kracht van twee) bevatten.
Maar voor dit voorbeeld, laten we kijken naar 4-bits gehele getallen. Tiny, maar nuttig voor illustratiedoeleinden.
Aangezien er vier bits in een dergelijk geheel getal zijn, kan het een van de 16 waarden aannemen; 16 is twee tot het vierde vermogen, of 2 keer 2 keer 2 keer 2. Wat zijn die waarden? Het antwoord is afhankelijk van de vraag of dit geheel getal een signed int
of een unsigned int
. Met een unsigned int
is de waarde nooit negatief; Er is geen teken geassocieerd met de waarde. Hier zijn de 16 mogelijke waarden van een vier-bits unsigned int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
… en hier zijn de 16 mogelijke waarden van een vier-bits signed int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1
Zoals u kunt zien, voor signed int
S De meest significante bit is 1
indien en alleen als het nummer negatief is. Dat is de reden waarom, voor signed int
s, dit bit staat bekend als het “tekenbit”.
Antwoord 2, Autoriteit 25%
In lekentaal is een niet-ondertekende int een geheel getal dat niet negatief kan zijn en dus een groter bereik aan positieve waarden heeft dan het kan aannemen. Een ondertekende int is een geheel getal dat negatief kan zijn, maar een lager positief bereik heeft in ruil voor meer negatieve waarden die het kan aannemen.
Antwoord 3, autoriteit 17%
int
en unsigned int
zijn twee verschillende typen integers. (int
kan ook worden aangeduid als signed int
, of gewoon signed
; unsigned int
kan ook worden aangeduid als als unsigned
.)
Zoals de namen impliceren, is int
een ondertekendgeheel getal en unsigned int
is een niet ondertekendgeheel getal type. Dat betekent dat int
negatieve waarden kan vertegenwoordigen en unsigned int
alleen niet-negatieve waarden kan vertegenwoordigen.
De C-taal stelt een aantal eisen aan de reeksen van deze typen. Het bereik van int
moet minimaal -32767
.. +32767
zijn, en het bereik van unsigned int
moet minimaal 0
zijn .. 65535
. Dit houdt in dat beide typen minimaal 16 bits moeten zijn. Ze zijn 32 bits op veel systemen, of zelfs 64 bits op sommige. int
heeft doorgaans een extra negatieve waarde vanwege de twee-complement-representatie die door de meeste moderne systemen wordt gebruikt.
Misschien is het belangrijkste verschil het gedrag van rekenen met teken en zonder teken. Voor ondertekende int
heeft overloop ongedefinieerd gedrag. Voor unsigned int
is er geen overloop; elke bewerking die een waarde oplevert die buiten het bereik van het type valt, loopt er omheen, dus bijvoorbeeld UINT_MAX + 1U == 0U
.
Elk type geheel getal, met of zonder teken, modelleert een subbereik van de oneindige reeks wiskundige gehele getallen. Zolang je werkt met waarden binnen het bereik van een type, werkt alles. Wanneer u de onder- of bovengrens van een type nadert, komt u een discontinuïteit tegen en kunt u onverwachte resultaten krijgen. Voor ondertekende integer-typen treden de problemen alleen op voor zeer grote negatieve en positieve waarden, die INT_MIN
en INT_MAX
overschrijden. Voor unsigned integer-typen treden problemen op voor zeer grote positieve waarden en bij nul. Dit kan een bron van bugs zijn. Dit is bijvoorbeeld een oneindige lus:
for (unsigned int i = 10; i >= 0; i --) [
printf("%u\n", i);
}
omdat i
altijdgroter dan of gelijk aan nul is; dat is de aard van niet-ondertekende typen. (In de lus, wanneer i
nul is, stelt i--
de waarde in op UINT_MAX
.)
Antwoord 4, autoriteit 11%
Soms weten we van tevoren dat de waarde die is opgeslagen in een bepaalde integer-variabele altijd positief zal zijn, bijvoorbeeld wanneer deze wordt gebruikt om alleen dingen te tellen. In zo’n geval kunnen we de variabele als unsigned declareren, zoals in, unsigned int num student;
. Met een dergelijke declaratie verschuift het bereik van toegestane gehele waarden (voor een 32-bits compiler) van het bereik -2147483648 tot +2147483647 naar het bereik 0 tot 4294967295. Het declareren van een geheel getal als niet-ondertekend verdubbelt dus bijna de grootte van de grootst mogelijke waarde die het anders kan hebben.
Antwoord 5
In de praktijk zijn er twee verschillen:
- afdrukken(bijv. met
cout
in C++ ofprintf
in C): niet-ondertekende integer-bitrepresentatie wordt geïnterpreteerd als een niet-negatief geheel getal door afdrukfuncties . - bestellen: de bestelling is afhankelijk van ondertekende of niet-ondertekende specificaties.
deze code kan het gehele getal identificeren met behulp van het bestelcriterium:
char a = 0;
a--;
if (0 < a)
printf("unsigned");
else
printf("signed");
char
wordt in sommige compilers als signed
beschouwd en in andere compilers als unsigned
. De bovenstaande code bepaalt welke in een compiler wordt beschouwd, met behulp van het bestelcriterium. Als a
niet is ondertekend, is het na a--
groter dan 0
, maar als het signed
is het zal minder dan nul zijn. Maar in beide gevallen is de bitweergave van a
hetzelfde. Dat wil zeggen, in beide gevallen doet a--
dezelfde wijziging aan de bitrepresentatie.