Wat is het verschil tussen ondertekende en unsigned int

Wat is het verschil tussen ondertekend en niet-ondertekend int?


Antwoord 1, Autoriteit 100%

Zoals u waarschijnlijk weet, worden intS inwendig in binair mogelijk opgeslagen. Typisch bevat een int32 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 intof een unsigned int. Met een unsigned intis 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 intS De meest significante bit is 1indien en alleen als het nummer negatief is. Dat is de reden waarom, voor signed ints, 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%

inten unsigned intzijn twee verschillende typen integers. (intkan ook worden aangeduid als signed int, of gewoon signed; unsigned intkan ook worden aangeduid als als unsigned.)

Zoals de namen impliceren, is inteen ondertekendgeheel getal en unsigned intis een niet ondertekendgeheel getal type. Dat betekent dat intnegatieve waarden kan vertegenwoordigen en unsigned intalleen niet-negatieve waarden kan vertegenwoordigen.

De C-taal stelt een aantal eisen aan de reeksen van deze typen. Het bereik van intmoet minimaal -32767.. +32767zijn, en het bereik van unsigned intmoet minimaal 0zijn .. 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. intheeft 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 intheeft overloop ongedefinieerd gedrag. Voor unsigned intis 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_MINen INT_MAXoverschrijden. 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 ialtijdgroter dan of gelijk aan nul is; dat is de aard van niet-ondertekende typen. (In de lus, wanneer inul 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:

  1. afdrukken(bijv. met coutin C++ of printfin C): niet-ondertekende integer-bitrepresentatie wordt geïnterpreteerd als een niet-negatief geheel getal door afdrukfuncties .
  2. 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");

charwordt in sommige compilers als signedbeschouwd en in andere compilers als unsigned. De bovenstaande code bepaalt welke in een compiler wordt beschouwd, met behulp van het bestelcriterium. Als aniet is ondertekend, is het na a--groter dan 0, maar als het signedis het zal minder dan nul zijn. Maar in beide gevallen is de bitweergave van ahetzelfde. Dat wil zeggen, in beide gevallen doet a--dezelfde wijziging aan de bitrepresentatie.

Other episodes