Tại sao int chỉ có 2 byte?


9

Khi sử dụng C / C ++ trên các nền tảng khác, intloạ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 longthay thế?


2
lưu ý rằng đó intlà 4 byte trên Arduino Do. A shortsẽ 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ụng int16_thoặc uint16_t.
Ron

Câu trả lời:


10

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.


3
Xin lưu ý: không phải Nhóm Arduino đã ánh xạ int đến int16_t, "int" là từ khóa dành riêng cho C / C ++ và ánh xạ loại là một phần của ABI ( gcc.gnu.org/wiki/avr-gcc ) mà Các nhà phát triển máy tính avr-gcc quyết định làm theo. Một sự khác biệt đáng chú ý khác là ở loại "gấp đôi" thường rộng 64 bit, trong khi ở avr-gcc là 32 bit như "float"
cmaglie

Cảm ơn. Không chắc chắn tại sao tôi viết điều đó. Tôi biết int phải đại diện cho 32.678 -> +32.767 (mặc dù, thực ra, tôi nghĩ rằng có một trình biên dịch độc quyền cho một trong những bộ xử lý NEC không tuân theo điều này). Tôi nghĩ rằng đó là vì tôi không thích ẩn độ rộng trên các hệ thống nhúng - sử dụng int16_t rõ ràng hơn nhiều.
Cyberg Ribbon

1
+1 cho việc sử dụng các loại bản địa rõ ràng! Trên Arduino Do, một intlà 32-bit! arduino.cc/en/Reference/int
Ron

3

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 intsẽ thường phụ thuộc vào:

  • nền tảng đích (bộ xử lý)
  • chính trình biên dịch

bạn đang nói sizeof(short) == sizeof(int) == sizeof(long)là có thể?
Ron

@ ron-e Về mặt lý thuyết, vâng, điều đó là có thể. Trong thực tế, tuy nhiên, tôi chưa bao giờ thấy điều đó. Trong hầu hết các trình biên dịch / nền tảng, người ta có thể mong đợi (mặc dù nó không bị áp đặt) sizeof(short) < sizeof(long).
jfpoilpret
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.