Permalänk
Avstängd

Two's complement notation

Sitter och bläddrar Computer Science: An overview, och jag är osäker på om jag helt förstår vad "Two's complement notation" är för något.

Texten anger följande:

Citat:

The most popular system for representing integers within today’s computers is
two’s complement notation. This system uses a fixed number of bits to represent each of the values in the system. In today’s equipment, it is common to use
a two’s complement system in which each value is represented by a pattern of
32 bits. Such a large system allows a wide range of numbers to be represented
but is awkward for demonstration purposes. Thus, to study the properties of two’s
complement systems, we will concentrate on smaller systems.
Figure 1.19 shows two complete two’s complement systems—one based on
bit patterns of length three, the other based on bit patterns of length four. Such
a system is constructed by starting with a string of 0s of the appropriate length
and then counting in binary until the pattern consisting of a single 0 followed by
1s is reached. These patterns represent the values 0, 1, 2, 3, . . . . The patterns
representing negative values are obtained by starting with a string of 1s of the
appropriate length and then counting backward in binary until the pattern consisting of a single 1 followed by 0s is reached. These patterns represent the values
-1, -2, -3, . . . . (If counting backward in binary is difficult for you, merely start
at the very bottom of the table with the pattern consisting of a single 1 followed
by 0s, and count up to the pattern consisting of all 1s.)
Note that in a two’s complement system, the leftmost bit of a bit pattern indicates the sign of the value represented. Thus, the leftmost bit is often called the
sign bit. In a two’s complement system, negative values are represented by the
patterns whose sign bits are 1; nonnegative values are represented by patterns
whose sign bits are 0.
In a two’s complement system, there is a convenient relationship between the
patterns representing positive and negative values of the same magnitude. They
are identical when read from right to left, up to and including the first 1. From
there on, the patterns are complements of one another. (The complement of a
pattern is the pattern obtained by changing all the 0s to 1s and all the 1s to 0s;
0110 and 1001 are complements.) For example, in the 4-bit system in Figure 1.19 the patterns representing 2 and -2 both end with 10, but the pattern representing 2 begins with 00, whereas the pattern representing -2 begins with 11.
This observation leads to an algorithm for converting back and forth between bit
patterns representing positive and negative values of the same magnitude. We
merely copy the original pattern from right to left until a 1 has been copied, then
we complement the remaining bits as they are transferred to the final bit pattern
(Figure 1.20).
Understanding these basic properties of two’s complement systems also leads
to an algorithm for decoding two’s complement representations. If the pattern to be decoded has a sign bit of 0, we need merely read the value as though the
pattern were a binary representation. For example, 0110 represents the value 6,
because 110 is binary for 6. If the pattern to be decoded has a sign bit of 1, we
know the value represented is negative, and all that remains is to find the magnitude of the value. We do this by applying the “copy and complement” procedure in Figure 1.20 and then decoding the pattern obtained as though it were a
straightforward binary representation. For example, to decode the pattern 1010,
we first recognize that since the sign bit is 1, the value represented is negative.
Hence, we apply the “copy and complement” procedure to obtain the pattern
0110, recognize that this is the binary representation for 6, and conclude that the
original pattern represents -6.

Tabellerna är omständiga att formatera in här, men de är långt förståeligare än texten för mig.
Första biten i en integersträng anger att heltalet är negativt om biten = 1, och följande bitar används helt vanligt och räknar uppåt från det lägsta negativa heltalet som ryms inom antalet bitar.

Är det svårare än så, och texten är bara väldigt omständig på ämnet, eller är det något viktigt inbakat här som jag missar?
Är det här något allmängiltigt för integertal, eller är detta en särskilt integer som tillåter negativa tal?

Permalänk
Festpilot 2020, Antiallo
Skrivet av Ricerunner:

Sitter och bläddrar Computer Science: An overview, och jag förstår inte riktigt vad "Two's complement notation" är för något.

Texten anger följande:
Tabellerna är omständiga att formatera in här, men de är långt förståeligare än texten för mig.
Första biten i en integersträng anger att heltalet är negativt om biten = 1, och följande bitar används helt vanligt och räknar uppåt från det lägsta negativa heltalet som ryms inom antalet bitar.

Är det svårare än så, och texten är bara väldigt omständig på ämnet, eller är det något viktigt inbakat här som jag missar?
Är det här något allmängiltigt för integertal, eller är detta en särskilt integer som tillåter negativa tal?
Och vad är Two's complement notation på svenska?

Tror uttrycken som används vid programmering är signed/unsigned (numbers/integers).

Två kompliment i binärbas är representationen av ett binärt tal där den största värdesiffran just visar om det är ett negativt eller positivt tal.

Du tänker rätt i att texten är (onödigt) komplex.

För att svara på din fråga, "two complement notation" är inget magiskt integertal eller nummertyp. Du kan läsa samma tal som om det vore en "unsigned" men då blir ju syftet/värdet med siffran troligen helt fel. Inte helt ovanligt fel att göra. Kort och gott är det inget speciellt med "1001", det handlar bara om perspektiv och om man anser att det är ett "signed/unsigned" tal.

Signed (1001) = -7
Unsigned (1001) = 9

För dataingenjören som jobbar på lågnivå så är det rätt arbiträrt om det binära tvåkomponent-talet är negativt/positivt och det är lite charmen med det hela när man ska jobba med talen i hårdvara. (Visst, lite handpåläggning krävs såklart)

Visa signatur

 | PM:a Moderatorerna | Kontaktformuläret | Geeks Discord |
Testpilot, Skribent, Moderator & Geeks Gaming Huvudadmin

Permalänk
Avstängd
Skrivet av DavidtheDoom:

Tror uttrycken som används vid programmering är signed/unsigned (numbers/integers).

Två kompliment i binärbas är representationen av ett binärt tal där den största värdesiffran just visar om det är ett negativt eller positivt tal.

Du tänker rätt i att texten är (onödigt) komplex.

För att svara på din fråga, "two complement notation" är inget magiskt integertal eller nummertyp. Du kan läsa samma tal som om det vore en "unsigned" men då blir ju syftet/värdet med siffran troligen helt fel. Inte helt ovanligt fel att göra. Kort och gott är det inget speciellt med "1001", det handlar bara om perspektiv och om man anser att det är ett "signed/unsigned" tal.

Signed (1001) = -7
Unsigned (1001) = 9

För dataingenjören som jobbar på lågnivå så är det rätt arbiträrt om det binära tvåkomponent-talet är negativt/positivt och det är lite charmen med det hela när man ska jobba med talen i hårdvara. (Visst, lite handpåläggning krävs såklart)

Tackar ödmjukast, det var en bra förklaring.
Men just begreppet signed, är det ett arbiträrt uttryck, eller refererar det till att det är standardintegern inom XDR-standard eller så?

Permalänk
Festpilot 2020, Antiallo
Skrivet av Ricerunner:

Tackar ödmjukast, det var en bra förklaring.
Men just begreppet signed, är det ett arbiträrt uttryck, eller refererar det till att det är standardintegern inom XDR-standard eller så?

Signed brukar inom programmera signalera till kompilatorn som översätter kodraderna till maskinkod att hantera värdet så att det kan innehålla både positiva och negativa värden. Dvs via tvåkompliment av binärformen.

Signed i sig betyder dock sällan något mer exakt än så och många gånger varierar det mellan olika språk, miljöer, kompilatorer och support-paket för processorer.

Det breda brukar vara:
int = signed heltal bredd motsvarande arkitektur som det kompileras mot.
uint# = unsigned #-bitar heltal

Sedan finns det uttryck som "signed", "unsigned", "unsigned int", etc som alla rör till det.
Det förekommer undantag och man får vara på sin vakt!

Jag har aldrig jobbat med XDR-standarden så jag kan inte uttala mig om vad som är kutymt i dessa kretsar. Förhoppningsvis kan annan medlem kliva in med mer utförling info här. Det gjorde det. Precis som det sägs nedan.
Värdetecken (+/-) är orsaken till att det heter "signed".

Jobbar man i hårdvara så är man sällan intresserad av det ena eller det andra utan det är oftast bara vektorer med ett antal bitar. Två-komplement är vanligare att man pratar om i dessa kretsar än i mjukvaruvärlden varför jag nämner detta.

Visa signatur

 | PM:a Moderatorerna | Kontaktformuläret | Geeks Discord |
Testpilot, Skribent, Moderator & Geeks Gaming Huvudadmin

Permalänk
Medlem
Skrivet av Ricerunner:

Tackar ödmjukast, det var en bra förklaring.
Men just begreppet signed, är det ett arbiträrt uttryck, eller refererar det till att det är standardintegern inom XDR-standard eller så?

Nu vet jag inte om jag förstod din fråga, men det lär komma ifrån att den högsta värdesiffran brukar kallas för just "sign-bit":

Sign bit

In computer science, the sign bit is a bit in a signed number representation that indicates the sign of a number. Only signed numeric data types have a sign bit, and its place is usually the leftmost, where the most significant bit in unsigned numbers resides. Floating point numbers in IEEE format are always signed, with the sign bit in the leftmost position. Typically if the sign bit is 1 then the number is negative or non-positive, while 0 indicates a non-negative number. In the two's complement representation, the sign bit has the weight −2−1 where w is the number of bits. In the ones' complement representation, the most negative value is 1 − 2−1, but there are two representations of zero, one for each value of the sign bit. In a sign-and-magnitude representation of numbers, the value of the sign bit determines whether the numerical value is positive or negative. When an 8-bit value is added to a 16-bit value using signed arithmetic, the processor unit propagates the sign bit through the high order half of the 16-bit register holding the 8-bit value – a process called sign extension or sign propagation. The process of sign extension is used whenever a smaller signed data type needs to be converted into a larger signed data type while still retaining its original numerical value.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem
Skrivet av Ricerunner:

Men just begreppet signed, är det ett arbiträrt uttryck, eller refererar det till att det är standardintegern inom XDR-standard eller så?

signed/unsigned är väl generella uttryck inom programmering som funnits åtminstone så länge det funnits datorer, och troligtvis längre än så. "sign" syftar ju på vilket tecken talet har framför sig, + eller -, och använder man binär representation så måste man också ha något sätt att representera tecknet där tvåkomplement är det vanligaste idag.

Jag vet för övrigt inte om du förstått hur tvåkomplement fungerar. Det handlar inte bara om att den första biten används för att indikera om talet är positivt eller negativt, utan för att konvertera ett positivt tal till negativt eller tvärtom så inverterar man alla bitar och adderar 1. Om man t.ex. använder 4 bitar så är 6 = 0110, och -6 = 1001 + 1 = 1010.

Permalänk
Avstängd

@DavidtheDoom @noMad17 Just sådana här svar får mig ju att bli alldeles till mig, känner mig mycket varmt välkommen.
Tror jag kommer vara mycket kompis med det här forumet kommande tiden.
Tack så jättemycket för utförliga svar.

Skrivet av perost:

signed/unsigned är väl generella uttryck inom programmering som funnits åtminstone så länge det funnits datorer, och troligtvis längre än så. "sign" syftar ju på vilket tecken talet har framför sig, + eller -, och använder man binär representation så måste man också ha något sätt att representera tecknet där tvåkomplement är det vanligaste idag.

Jag vet för övrigt inte om du förstått hur tvåkomplement fungerar. Det handlar inte bara om att den första biten används för att indikera om talet är positivt eller negativt, utan för att konvertera ett positivt tal till negativt eller tvärtom så inverterar man alla bitar och adderar 1. Om man t.ex. använder 4 bitar så är 6 = 0110, och -6 = 1001 + 1 = 1010.

Fast i tabellen som står i läroboken står det att talet 1001 inom tvåkomplement skulle vara -7, eftersom 1000 = -8 är det lägsta möjliga negativa heltalet inom 4 bitar.
Regeln ser ut att gälla, med tillägget att det inverterade talet med en 1:a som signbit är den additiva inversen av det positiva talet med 0 i signbit -1.
De närmsta grannarna i mitten av tabellen är ju 0000 = 0 och 1111 = -1, så bara det torde indikera att regeln ovan gäller.
Eller finns det någon särskilt notation där regeln gäller att en invers av ett signerat binärt tal är en direkt additiv invers av den numerära representationen, för att man utelämnat 0?

Permalänk
Medlem
Skrivet av Ricerunner:

Fast i tabellen som står i läroboken står det att talet 1001 inom tvåkomplement skulle vara -7, eftersom 1000 = -8 är det lägsta möjliga negativa heltalet inom 4 bitar.
Regeln ser ut att gälla, med tillägget att det inverterade talet med en 1:a som signbit är den additiva inversen av det positiva talet med 0 i signbit -1.
De närmsta grannarna i mitten av tabellen är ju 0000 = 0 och 1111 = -1, så bara det torde indikera att regeln ovan gäller.
Eller finns det någon särskilt notation där regeln gäller att en invers av ett signerat binärt tal är en direkt additiv invers av den numerära representationen, för att man utelämnat 0?

Jag vet inte riktigt vad det är du efterfrågar, men invertering i tvåkomplementsform är ju definierad just som invertering av bitarna följt av en addition med 1. Så -7 är 1001 eftersom 7 är 0111, och 1000 + 1 = 1001. Detta gör att addition, subtraktion och multiplikation med tvåkomplementsform fungerar utan att ta hänsyn till talets tecken, så t.ex. -8 + 1 = -7 blir 1000 + 1 = 1001.

0 är inte utelämnat, utan 0 = 0000 ger att "-0" är 1111 + 1 = 0000 (egentligen 10000, men den första biten kapas om man använder fyra bitar). Detta är en av fördelarna med tvåkomplement, med t.ex. enkomplement har man 0000 = 0 och 1111 = -0 vilket krånglar till det en del.

Permalänk
Avstängd
Skrivet av perost:

Jag vet inte riktigt vad det är du efterfrågar, men invertering i tvåkomplementsform är ju definierad just som invertering av bitarna följt av en addition med 1. Så -7 är 1001 eftersom 7 är 0111, och 1000 + 1 = 1001. Detta gör att addition, subtraktion och multiplikation med tvåkomplementsform fungerar utan att ta hänsyn till talets tecken, så t.ex. -8 + 1 = -7 blir 1000 + 1 = 1001.

0 är inte utelämnat, utan 0 = 0000 ger att "-0" är 1111 + 1 = 0000 (egentligen 10000, men den första biten kapas om man använder fyra bitar). Detta är en av fördelarna med tvåkomplement, med t.ex. enkomplement har man 0000 = 0 och 1111 = -0 vilket krånglar till det en del.

Jomen det besvarade ändå frågan bra, enkomplement var det jag efterfrågade.

Blev bara förvirrad då det du ursprungligen sade indikerade att 1111 skulle ha varit -0 inom tvåkomplement.
Men allt väl nu.

Men ställer inte enkomplement till det när man ska köra addition?
Tänker på att -1 + 2 skulle resultera i 0.