Dela via


Signumförlängning

När ett 32-bitars signerat heltal är negativt är dess högsta bit lika med ett. När det här 32-bitars signerade heltalet gjuts till ett 64-bitars tal kan de höga bitarna anges till noll (bevara det osignerade heltals- och hexadecimala värdet för talet) eller så kan de höga bitarna anges till ett (bevara det signerade värdet för talet). Den senare situationen kallas för teckentillägg.

Felsökningsprogrammet följer olika regler för teckentillägg i MASM-uttryck, I C++-uttryck och när tal visas.

Teckenförlängning i MASM-uttryck

Under vissa förhållanden teckentilläggs tal automatiskt av MASM-uttrycksevaluatorn. Teckentillägget kan endast påverka tal från 0x80000000 till 0xFFFFFFFF. Det innebär att teckentillägget endast påverkar tal som kan skrivas i 32 bitar med den höga biten lika med 1.

Talet 0x12345678 förblir alltid 0x00000000'12345678 när felsökaren behandlar det som ett 64-bitarsnummer. Å andra sidan, när 0x890ABCDE behandlas som ett 64-bitarsvärde, kan det förbli 0x00000000'890ABCDE eller så kan MASM-uttrycksutvärderaren signera utöka det till 0xFFFFFFFF'890ABCDE.

Ett tal från 0x80000000 till 0xFFFFFFFF signeras utökat baserat på följande kriterier:

  • Numeriska konstanter teckenförlängs aldrig i användarläge. I kärnläge är en numerisk konstant teckenutvidgad om den inte innehåller en grav accent ( ` ) före de låga bytena. I kernelläge är till exempel hexadecimala tal EEAA1122 och 00000000EEAA1122 tecknutvidgade, men 00000000`EEAA1122 och 0`EEAA1122 görs inte.

  • Ett 32-bitarsregister teckentilläggs i båda lägena.

  • Pseudoregister lagras alltid som 64-bitarsvärden. De blir inte signalförlängda när de utvärderas. När ett pseudoregister tilldelas ett värde utvärderas uttrycket som används enligt C++-standardvillkoren.

  • Enskilda tal och register i ett uttryck kan teckenutökas, men inga andra beräkningar under uttrycksutvärderingen genomgår teckenutökning. Därför kan du maskera de höga bitarna av ett tal eller registrera med hjälp av följande syntax.

    ( 0x0`FFFFFFFF & expression )
    

Teckenutvidgning i C++-uttryck

När felsökningsprogrammet utvärderar ett C++-uttryck gäller följande regler:

  • Register och pseudoregister teckenförlängs aldrig.

  • Alla andra värden behandlas exakt som C++ skulle behandla värden av deras typ.

Visa Sign-Extended och 64-bitarsnummer

Förutom 32-bitars- och 16-bitarsregister lagras alla tal internt i felsökningsprogrammet som 64-bitarsvärden. Men när ett tal uppfyller vissa villkor visar felsökningsprogrammet det som ett 32-bitars tal i kommandoutdata.

Felsökningsprogrammet använder följande villkor för att avgöra hur tal ska visas:

  • Om de höga 32 bitarna av ett tal är alla nollor (dvs. om talet kommer från 0x00000000'000000000 till 0x00000000'FFFFFFFF), visar felsökningsprogrammet talet som ett 32-bitars tal.

  • Om de höga 32 bitarna av ett tal alla är en och om den högsta biten av de låga 32 bitarna också är en (det vill säga om talet är från 0xFFFFFFFF'800000000 till 0xFFFFFFFF'FFFFFFFFFF), förutsätter felsökningsprogrammet att talet är ett teckenförlängt 32-bitarsnummer och visar det som ett 32-bitarsnummer.

  • Om de föregående två villkoren inte gäller (dvs. om talet är från 0x00000001'000000000 till 0xFFFFFFFF'7FFFFFFF) visar felsökningsprogrammet talet som ett 64-bitars tal.

På grund av dessa visningsregler, när ett tal visas som ett 32-bitars tal från 0x80000000 till 0xFFFFFFFF, kan du inte bekräfta om de höga 32 bitarna är alla ettor eller alla nollor. För att skilja mellan dessa två fall måste du utföra ytterligare en beräkning på talet (till exempel maskera en eller flera av de höga bitarna och visa resultatet).

Se även

MASM-nummer och operatorer

C++-tal och operatorer

MASM-uttryck jämfört med C++-uttryck

Exempel på blandade uttryck