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ụ.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
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. bit được diễn giải như sau.
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 ở độ 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 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.
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.
11111010 → unsigned 250 · signed -6 · hex 0xFA
Carry khác overflow có dấu
Cộng hai số cùng dấu mà kết quả đổi dấu thì overflow. Với bốn bit, lưu thành 1010 trông như -6; 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 và . Giải thích cả kết quả negate .
Đọc giải thích
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.