2011-09-25 33 views
5

Tôi đã phải đối mặt với một câu hỏi phỏng vấn liên quan đến các hệ thống nhúng và C/C++. Câu hỏi là:khi hai dữ liệu được ký 16 bit được nhân lên, kích thước của kết quả là gì?

Nếu chúng ta nhân 2 chữ ký (bổ sung 2) dữ liệu 16 bit, kích thước của dữ liệu kết quả là gì?

Tôi đã bắt đầu cố gắng nó với một ví dụ về nhân hai ký 4-bit, vì vậy, nếu chúng ta nhân +7-7, chúng tôi kết thúc với -49, đòi hỏi 7 bit. Nhưng, tôi không thể xây dựng một mối quan hệ chung.

Tôi nghĩ rằng tôi cần phải hiểu nhị phân nhân sâu để giải quyết câu hỏi này.

Trả lời

3

Điều này sẽ tùy thuộc vào ngữ cảnh. Trong C/C++, tất cả các trung gian nhỏ hơn int được thăng cấp thành int. Vì vậy, nếu int lớn hơn 16 bit, thì kết quả sẽ là số nguyên 32 bit đã ký.

Tuy nhiên, nếu bạn gán nó trở lại số nguyên 16 bit, nó sẽ cắt bớt chỉ để lại 16 bit dưới cùng của phần bổ sung hai của số mới.

Vì vậy, nếu định nghĩa của bạn về "kết quả" là trung gian ngay sau khi nhân, thì câu trả lời là kích thước của int. Nếu bạn xác định kích thước như sau khi bạn đã lưu nó trở lại biến 16 bit, thì câu trả lời là kích thước của kiểu số nguyên 16 bit.

+0

Câu hỏi này là ngôn ngữ độc lập, nhưng đó là kiến ​​thức hữu ích cho các lập trình viên C và C++. –

7

Đầu tiên, số bit được ký n bit chứa giá trị trong phạm vi - (2^(n-1)) .. + (2^(n-1)) - 1. Ví dụ: đối với n = 4, phạm vi là - (2^3) .. (2^3) -1 = -8 .. + 7

Phạm vi của kết quả nhân là -8 * + 7 .. -8 * -8 = -56 .. + 64.

+64 lớn hơn 2^6-1 - đó là 2^6 = 2^(2n-2)! Bạn sẽ cần 2n-1 bit để lưu trữ số nguyên POSITIVE đó.

Trừ khi bạn đang thực hiện mã hóa độc quyền (xem đoạn tiếp theo) - bạn sẽ cần 2n bit: Một bit cho dấu và 2n-1 bit cho giá trị tuyệt đối của kết quả phép nhân.

Nếu M là kết quả của phép nhân, bạn có thể lưu trữ -M hoặc M-1 thay thế. điều này có thể giúp bạn tiết kiệm 1 bit.

Các vấn đề liên quan