2013-06-06 40 views
5

Trong phép toán điểm cố định, tôi sử dụng rất nhiều tín hiệu 16 bit và thực hiện phép nhân với kết quả trung gian 32 bit. Ví dụ:Ký số nguyên và dấu không dấu

int16_t a = 16384; //-1.0q14 or 1.0*2^14 
int16_t b = -24576; // -1.4q14 or 1.4*2^14 
int16_t c; // result will be q14 

c = (int16_t)(((int32_t)a * (int32_t)b)>>14); 

Cho phép nói là một số q14 rồi c có cùng tỷ lệ với b.

Điều này là tốt và hoạt động đối với số học chưa ký cũng như số học đã ký.

Câu hỏi đặt ra là: Điều gì sẽ xảy ra nếu tôi trộn các loại? Ví dụ, nếu tôi biết hệ số nhân "a" luôn nằm trong khoảng từ 0.0 đến 1.0, thì nó là hấp dẫn để làm cho nó trở thành một số q15 không dấu để có được độ chính xác cao hơn (và thay đổi số lần dịch chuyển thành 15). Tuy nhiên, tôi không bao giờ hiểu điều gì xảy ra nếu bạn cố gắng nhân các số đã ký và chưa ký trong C và đã tránh nó. Trong ASM tôi không nhớ có một hướng dẫn nhân mà sẽ làm việc với các loại hỗn hợp trên bất kỳ kiến ​​trúc, vì vậy ngay cả khi C làm điều đúng tôi không chắc chắn nó sẽ tạo ra mã hiệu quả.

Tôi có nên tiếp tục thực hành không trộn các loại chưa ký trong mã điểm cố định không? Hoặc điều này có thể hoạt động tốt không?

+2

Bài đăng này sẽ trả lời bạn đang đặt câu hỏi về những gì sẽ xảy ra khi nhân các số nguyên đã ký và chưa ký. http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe. Câu trả lời ngắn gọn là, miễn là chúng có cùng một thứ hạng (kích thước), một chữ ký được ngầm định là chưa được định kiểu. –

+0

Đăng câu trả lời thay vì nhận xét để tôi có thể chấp nhận ;-) – phkahler

+0

Vì lý do nào đó vào thời điểm tôi nghĩ tôi chỉ trả lời một phần câu hỏi của bạn, vì vậy tôi đã để lại nhận xét đó. Bây giờ tôi nhìn lại, tôi không chắc tại sao tôi lại nghĩ vậy. Cảm ơn! –

Trả lời

5

This post Nói về những gì sẽ xảy ra khi nhân các số nguyên đã ký và chưa ký. Câu trả lời ngắn gọn là, miễn là chúng có cùng một thứ hạng (kích thước), một chữ ký được ngầm định là chưa được định kiểu. Miễn là bạn hiểu các quy tắc typecasting (của bất kỳ ngôn ngữ nào bạn đang lập trình), hoặc sử dụng typecasting rõ ràng, và bạn cũng hiểu ý nghĩa của typecasting từ signed to unsigned (một số âm sẽ tạo ra những gì có thể xuất hiện như là vô nghĩa khi được sắp xếp thành giá trị đã ký), thì không có vấn đề gì khi trộn các loại đã ký và chưa ký.

+0

Trong trường hợp của tôi, các loại trộn sẽ dẫn đến kết quả sai theo các quy tắc. Và đó là điều tôi sợ. – phkahler

+1

Bạn có thể chỉnh sửa bài đăng của mình ở trên với các giá trị chính xác mà bạn đang phỏng đoán thành a và b để đưa ra kết quả đi ngược lại các quy tắc không? –

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