Tôi có đoạn code C sau:Ngôn ngữ C: Giá trị #DEFINEd làm lộn xộn phép nhân 8 bit. Tại sao?
#define PRR_SCALE 255
...
uint8_t a = 3;
uint8_t b = 4;
uint8_t prr;
prr = (PRR_SCALE * a)/b;
printf("prr: %u\n", prr);
Nếu tôi biên dịch này (sử dụng một trình biên dịch nền tảng MSP430, cho một nhúng hệ điều hành nhỏ gọi là contiki) kết quả là 0 trong khi tôi mong đợi 191. (uint8_t là typedef' ed như một char unsigned)
Nếu tôi thay đổi nó để:
uint8_t a = 3;
uint8_t b = 4;
uint8_t c = 255;
uint8_t prr;
prr = (c * a)/b;
printf("prr: %u\n", prr);
nó hoạt động một cách chính xác và in 191.
01.235.Biên dịch một phiên bản đơn giản của 'bình thường' này bằng cách sử dụng gcc trên một hộp Ubuntu in giá trị chính xác trong cả hai trường hợp.
Tôi không chắc chắn lý do tại sao điều này xảy ra. Tôi có thể phá vỡ nó bằng cách gán giá trị DEFINEd cho biến trước, nhưng tôi không muốn làm điều đó.
Có ai biết tại sao điều này không? Có lẽ với một liên kết đến một số thông tin thêm về điều này?
tôi chắc chắn sẽ mong đợi cả hai để in 191. trong trường hợp thứ hai, đầu tiên c và một được thúc đẩy int độc lập và do đó nhân của họ không thể tràn. Điều tương tự cũng xảy ra trong trường hợp đầu tiên (mặc dù ở đó, PRR_SCALE đã là int - nhưng điều đó sẽ không thay đổi quảng cáo của a thành int). gcc của bạn trên hộp của bạn hoạt động chính xác tốt. –
kiểm tra xem bạn đã bao gồm tiêu đề stdio.h chưa. tôi biết rằng một trình biên dịch cho msp430 không cho phép khai báo hàm tiềm ẩn xảy ra: nếu đó là trường hợp, lệnh gọi printf sẽ gây ra hành vi không xác định và kết quả "0" sẽ được giải thích qua đó. chỉ hai xu của tôi. không nghĩ rằng đây là giá trị một câu trả lời :) –
@ litb: stdio.h được bao gồm. – Rabarberski