Altifigence Academy

8 / 37 · Khái niệm

Bù hai, mở rộng dấu và overflow

Phân biệt diễn giải signed và điều kiện overflow phép cộng bằng công thức, phản ví dụ.

Trọng số bit cao nhất thay đổi

Số nguyên bù haiBù hai Cách biểu diễn số nguyên có dấu bằng chuỗi bit có độ rộng cố định. Phạm vi n bit là −2^(n−1) đến 2^(n−1)−1. NN bit được diễn giải như sau.

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 bốn bit là 10 nếu unsignedunsigned Quy tắc diễn giải chuỗi bit là số nguyên không âm. Phạm vi n bit là 0 đến 2^n−1 và có thể khác diễn giải signed của cùng chuỗi bit. Tìm hiểu thêm, -6 nếu signed; không phải bỏ bit dấu rồi đọc phần còn lại như trị tuyệt đối. Có thể tạo −x-x ở độ rộng cố định bằng đảo bitPhủ định Phép NOT đổi 0 thành 1 và 1 thành 0. Gạch trên biểu thức nghĩa là áp dụng NOT cho toàn bộ phần nằm dưới gạch. Tìm hiểu thêm rồi cộng 1, nhưng +8 đối của giá trị nhỏ nhất −8-8 không nằm trong cùng phạm vi signed bốn bit.

Mở rộng phải bảo toàn giá trị

Mở rộng unsigned thêm 0 phía trước; mở rộng signed lặp bit dấu cũ. 1010 thành 00001010 là +10, thành 11111010 là -6. Cùng mở rộng một chuỗi bit nhưng cách diễn giải khác cần kết nối khác.

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]);

Ví dụ này cộng hai toán hạng signed không có carry đầu vào. exact giữ tổng năm bit, rồi kiểm tra dấu của kết quả thu hẹp.

Giá trị đầu là 11111010. Xác nhận unsigned 250 và signed −6 dùng cùng chuỗi bit. Đổi b7 làm hai cách diễn giải thay đổi giá trị theo hai hướng khác nhau.

Đọc dấu từ cùng tám bit

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

Carry khác overflow có dấu

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})

Cộng hai số cùng dấu mà kết quả đổi dấu thì overflow. Với bốn bit, 7+37+3 lưu thành 1010 trông như -6; −8+(−1)-8+(-1) lưu thành 0111 trông như +7. Cộng hai số khác dấu không tạo kiểu vượt phạm vi này.

Trộn signed và unsigned trong RTL dễ gây nhầm quy tắc so sánh và mở rộng. Nêu rõ độ rộng, signedness của hai toán hạng; đưa giá trị nhỏ nhất, -1, 0 và lớn nhất vào kiểm tra biên.

Tự thử

Trong signed bốn bit, tìm chuỗi lưu và overflow của −3+(−4)-3+(-4) và 5+55+5. Giải thích cả kết quả negate −8-8.

Đọc giải thích

−7-7 là 1001, không overflow. 10 vượt phạm vi, lưu thành 1010 (-6), nên overflow. Đảo -8 rồi cộng 1 vẫn còn 1000 vì không biểu diễn được +8; không được coi đây là phép tính trị tuyệt đối đúng.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.