Tôi đang viết một ứng dụng trong c cho STM32F105, sử dụng gcc.
Trong quá khứ (với các dự án đơn giản hơn), tôi đã luôn luôn được xác định các biến như char
, int
, unsigned int
, và vân vân.
Tôi thấy rằng người ta thường sử dụng các loại quy định tại stdint.h, chẳng hạn như int8_t
, uint8_t
, uint32_t
, vv Điều này đúng trong nhiều API mà tôi đang sử dụng, và cũng có trong thư viện CMSIS ARM từ ST.
Tôi tin rằng tôi hiểu tại sao chúng ta nên làm như vậy; để cho phép trình biên dịch tối ưu hóa không gian bộ nhớ tốt hơn. Tôi hy vọng có thể có thêm lý do.
Tuy nhiên, do các quy tắc quảng cáo số nguyên của c, tôi tiếp tục chạy theo các cảnh báo chuyển đổi bất cứ khi nào tôi cố gắng thêm hai giá trị, thực hiện thao tác theo bit, v.v. Cảnh báo sẽ đọc một cái gì đó như conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. Vấn đề được thảo luận ở đây và ở đây .
Nó không xảy ra khi sử dụng các biến được khai báo là int
hoặc unsigned int
.
Để đưa ra một vài ví dụ, đưa ra điều này:
uint16_t value16;
uint8_t value8;
Tôi sẽ phải thay đổi điều này:
value16 <<= 8;
value8 += 2;
đến đây:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
Thật xấu xí, nhưng tôi có thể làm điều đó nếu cần thiết. Đây là câu hỏi của tôi:
Có trường hợp chuyển đổi từ không dấu sang đã ký và trở lại không dấu sẽ làm cho kết quả không chính xác?
Có bất kỳ lý do lớn nào khác cho / không sử dụng các loại số nguyên stdint.h không?
Dựa trên các câu trả lời tôi nhận được, có vẻ như các loại stdint.h thường được ưa thích hơn, mặc dù c chuyển đổi uint
thành int
và quay lại. Điều này dẫn đến một câu hỏi lớn hơn:
- Tôi có thể ngăn các cảnh báo của trình biên dịch bằng cách sử dụng typecasting (ví dụ
value16 = (uint16_t)(value16 << 8);
). Tôi chỉ đang che giấu vấn đề? Có cách nào tốt hơn để đi về nó?
value8 += 2u;
và value8 = value8 + 2u;
, nhưng tôi nhận được cùng một cảnh báo.
8u
và2u
.