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?
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. –
Đăng câu trả lời thay vì nhận xét để tôi có thể chấp nhận ;-) – phkahler
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! –