Altifigence Academy

8 / 37 · Konsep

Komplemen dua, perluasan tanda, dan overflow

Bedakan interpretasi signed dari syarat overflow penjumlahan melalui persamaan dan contoh penyangkal.

Bobot bit paling signifikan berubah

Bilangan bulat komplemen duaKomplemen dua Representasi bilangan bulat bertanda dengan pola bit berlebar tetap. Rentang n bit adalah −2^(n−1) hingga 2^(n−1)−1. selebar NN bit ditafsirkan sebagai:

s=−bN−12N−1+∑i=0N−2bi2is=-b_{N-1}2^{N-1}+\sum_{i=0}^{N-2}b_i2^i
−2N−1≤s≤2N−1−1-2^{N-1}\le s\le 2^{N-1}-1

1010 empat bit bernilai 10 sebagai unsignedUnsigned Interpretasi pola bit sebagai bilangan bulat nonnegatif. Rentang n bit adalah 0 hingga 2^n−1 dan dapat berbeda dari interpretasi signed pola yang sama. Selengkapnya dan -6 sebagai signed. Caranya bukan memisahkan bit tanda lalu membaca sisanya sebagai nilai mutlak. Pada lebar tetap, −x-x diperoleh dengan membalikNegasi Operasi NOT menukar 0 dan 1. Garis di atas ekspresi menerapkan NOT pada seluruh ekspresi yang dicakupnya. Selengkapnya bit lalu menambah 1; tetapi +8, lawan dari minimum -8, tidak berada dalam rentang signed empat bit.

Perluasan harus mempertahankan nilai

Perluasan unsigned menambahkan 0 di depan; perluasan signed mengulang bit tanda. 1010 menjadi +10 jika diperluas ke 00001010, tetapi tetap -6 jika menjadi 11111010. Memperlebar pola yang sama membutuhkan rangkaian berbeda menurut interpretasinya.

SystemVerilog
logic signed [3:0] a, b;
logic signed [4:0] exact;
logic [3:0] result;
logic overflow;
assign exact = {a[3], a} + {b[3], b};
assign result = exact[3:0];
assign overflow = (a[3] == b[3]) && (result[3] != a[3]);

Contoh ini menjumlahkan dua operand signed tanpa carry masuk. exact mempertahankan jumlah lima bit, lalu memeriksa tanda hasil yang dipersempit.

Nilai awal 11111010 adalah pola yang sama untuk unsigned 250 dan signed −6. Mengubah b7 membuat kedua interpretasi bergerak ke arah berlawanan.

Membaca tanda pada 8 bit yang sama

11111010 → unsigned 250 · signed -6 · hex 0xFA

Carry berbeda dari overflow signed

V=aN−1⊕bN−1‾ (sN−1⊕aN−1)V=\overline{a_{N-1}\oplus b_{N-1}}\,(s_{N-1}\oplus a_{N-1})

Jika dua nilai bertanda sama menghasilkan tanda berbeda, terjadi overflow. Pada empat bit, 7+37+3 tersimpan sebagai 1010 atau -6, sedangkan −8+(−1)-8+(-1) sebagai 0111 atau +7. Penjumlahan dua bilangan bertanda berbeda tidak menimbulkan pelampauan ini.

Campuran signed dan unsigned dalam RTL membingungkan aturan perbandingan serta perluasan. Nyatakan lebar dan signedness kedua operand, lalu uji minimum, -1, 0, dan maksimum.

Coba sendiri

Untuk signed empat bit, tentukan pola tersimpan dan overflow dari −3+(−4)-3+(-4) serta 5+55+5. Jelaskan juga hasil negasi −8-8.

Baca penjelasan

−7-7 adalah 1001 tanpa overflow. 10 di luar rentang dan tersimpan sebagai 1010 (-6), sehingga overflow. Membalik -8 lalu menambah 1 kembali menghasilkan 1000 karena +8 tidak dapat direpresentasikan; jangan menggunakannya sebagai perhitungan nilai mutlak yang benar.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.