Wskaż poprawny zapis liczby −12(10) metodą znak-moduł do postaci ośmiobitowej liczby dwójkowej.
Odpowiedź 10001100₍zm₎ jest poprawna, bo w metodzie znak-moduł najstarszy bit, czyli pierwszy z lewej, oznacza znak liczby, a pozostałe bity zapisują wartość bezwzględną liczby. Dla liczby −12₍₁₀₎ znak jest ujemny, więc bit znaku musi mieć wartość 1. Następnie zapisujemy moduł, czyli samo 12. W systemie dwójkowym 12₍₁₀₎ = 1100₂, ponieważ 12 = 8 + 4. Ponieważ ma to być liczba ośmiobitowa, zostaje 7 bitów na moduł: 0001100. Po dołączeniu bitu znaku dostajemy 1 0001100, czyli 10001100₍zm₎. W praktyce takie rozróżnienie jest ważne przy analizie niskopoziomowej reprezentacji danych, np. w architekturze komputerów, asemblerze albo podczas omawiania sposobów kodowania liczb całkowitych. Moim zdaniem warto tu zawsze najpierw oddzielić znak od wartości, bo wtedy nie myli się znak-moduł z kodem U2. W branży przy dokumentowaniu formatów danych dobra praktyka jest taka, żeby jasno podać liczbę bitów oraz metodę kodowania, bo ten sam ciąg 10001100 może znaczyć coś zupełnie innego w różnych reprezentacjach.
W tym zadaniu kluczowe jest to, że chodzi o zapis ośmiobitowy metodą znak-moduł, a nie o zwykłe dopisanie znaku minus przed liczbą ani o zapis ułamkowy. W metodzie znak-moduł pierwszy bit od lewej jest bitem znaku: 0 oznacza liczbę dodatnią, a 1 oznacza liczbę ujemną. Pozostałe 7 bitów przechowuje moduł, czyli wartość bezwzględną liczby. Dla −12₍₁₀₎ modułem jest 12, a 12 w systemie binarnym to 1100₂. Po uzupełnieniu do 7 bitów mamy 0001100, więc cały zapis powinien wyglądać jako 10001100₍zm₎. Zapis 00001100₍zm₎ opisuje dodatnie 12, bo bit znaku ma tam wartość 0. To bardzo typowa pomyłka: ktoś poprawnie zamienia 12 na binarnie, ale zapomina, że liczba w treści jest ujemna. Z kolei formy typu +1.11000₍zm₎ oraz −1.11000₍zm₎ nie pasują do wymogu ośmiobitowej liczby całkowitej w tej reprezentacji. Wyglądają bardziej jak zapis z częścią ułamkową albo zapis z wyraźnym znakiem poza ciągiem bitów, a tutaj znak ma być zakodowany jako bit, nie jako symbol + lub −. Z mojego doświadczenia najlepiej przy takich zadaniach zrobić trzy kroki: ustalić znak, zamienić wartość bezwzględną na dwójkową, a potem dopełnić zerami do wymaganej długości. Warto też pamiętać, że znak-moduł to nie to samo co kod U2, używany powszechnie w procesorach do działań arytmetycznych. W U2 wynik dla −12 byłby inny, więc mieszanie tych metod prowadzi do błędnych odpowiedzi, nawet jeśli sama konwersja dziesiętna na binarną jest dobrze zrobiona.