Khi sử dụng C / C ++ trên các nền tảng khác, int
loại thường là 4 byte (hoặc có khả năng nhiều hơn). Tuy nhiên, trên Arduino, nó chỉ có 2 byte.
Tại sao nó khác nhau? Nó có ảnh hưởng đến hiệu suất nếu tôi luôn sử dụng 4 byte long
thay thế?
Khi sử dụng C / C ++ trên các nền tảng khác, int
loại thường là 4 byte (hoặc có khả năng nhiều hơn). Tuy nhiên, trên Arduino, nó chỉ có 2 byte.
Tại sao nó khác nhau? Nó có ảnh hưởng đến hiệu suất nếu tôi luôn sử dụng 4 byte long
thay thế?
Câu trả lời:
ATmega328 được sử dụng trong rất nhiều Arduinos là vi điều khiển 8 bit. Điều này có nghĩa là các thanh ghi là 8 bit, bus dữ liệu là 8 bit, các cổng là 8 bit. Có một số khía cạnh 16 bit tối thiểu cho hệ thống (ví dụ: một trong các bộ định thời), nhưng gần như mọi thứ đều là 8 bit.
Do đó, hầu hết các hoạt động xử lý 8 bit cùng một lúc. Làm việc trên bất cứ thứ gì ngoại trừ 8 bit (tức là số nguyên 16 bit hoặc 32 bit và số dấu phẩy động) đòi hỏi những gì về cơ bản có thể được mô tả là mô phỏng phần mềm, trong đó trình biên dịch sử dụng nhiều lệnh để làm việc trên các biến lớn hơn này.
8 bit rõ ràng là đủ để giải quyết một cổng 8 bit. Nó cũng đủ để xử lý nhiều bộ đếm vòng lặp, giá trị trả về và ký tự ASCII. Nó không thực sự đủ mặc dù khi xử lý số. Một int 8 bit đã ký (int8_t) chỉ có thể đại diện cho -128 -> +127. Chưa ký (uint8_t) chỉ có thể đại diện cho 0 -> 255.
Số nguyên 8 bit khá hạn chế. C / C ++ int phải đại diện cho ít nhất -32,678 -> +32,767 để ánh xạ tới int16_t - kích thước nhỏ nhất sẽ làm như vậy. Điều này mang lại sự cân bằng tốt về phạm vi và hiệu quả. Điều này đặc biệt quan trọng khi người mới bắt đầu học - tràn không thực sự là điều mà những người không phải lập trình viên hiểu được.
Tuy nhiên, có một tác động hiệu suất của việc này, bởi vì hầu hết các hoạt động 16 bit mất ít nhất gấp đôi thời gian hoạt động 8 bit và sử dụng gấp đôi số lượng đăng ký. Điều này có thể hoặc không thể làm cho một sự khác biệt với bạn.
Nhiều người trong chúng ta chuyển sang các loại bản địa như int8_t và uint8_t vì nó cho phép bạn kiểm soát nhiều hơn.
int
là 32-bit! arduino.cc/en/Reference/int
Một thực tế quan trọng về ngôn ngữ C và C ++ là các tiêu chuẩn tương ứng của chúng không xác định kích thước (tính bằng byte) của các loại số dấu phẩy động và tích phân.
Họ chỉ xác định phạm vi tối thiểu và mối quan hệ giữa các phạm vi này, ví dụ:
range(short) <= range(int) < range(long)
Vì vậy, kích thước của eg int
sẽ thường phụ thuộc vào:
sizeof(short) == sizeof(int) == sizeof(long)
là có thể?
sizeof(short) < sizeof(long)
.
int
là 4 byte trên Arduino Do. Ashort
sẽ là 2 byte trên tất cả Ardunios hiện có, nhưng tôi nhấn mạnh lời khuyên của người khác nên sử dụngint16_t
hoặcuint16_t
.