Mengapa hanya 2 byte int?

9

Saat menggunakan C / C ++ pada platform lain, inttipenya biasanya 4 byte (atau berpotensi lebih). Namun, pada Arduino, hanya 2 byte.

Kenapa berbeda? Apakah itu mempengaruhi kinerja jika saya selalu menggunakan 4 byte longsaja?

Peter Bloomfield
sumber
2
perhatikan bahwa int4 byte pada Arduino Due. A shortakan menjadi 2 byte pada semua Ardunios yang ada, tetapi saya menekankan saran orang lain untuk menggunakan int16_tatau uint16_t.
Ron

Jawaban:

10

ATmega328 yang digunakan di banyak Arduinos adalah mikrokontroler 8-bit. Ini berarti bahwa register adalah 8-bit, bus data adalah 8-bit, porta adalah 8-bit. Ada beberapa aspek minimal 16-bit untuk sistem (misalnya salah satu timer), tetapi hampir semuanya 8-bit.

Oleh karena itu, sebagian besar operasi menangani 8-bit sekaligus. Bekerja pada apa pun kecuali 8-bit (yaitu bilangan bulat 16-bit atau 32-bit dan angka floating point) membutuhkan apa yang pada dasarnya dapat digambarkan sebagai emulasi perangkat lunak, di mana kompiler menggunakan beberapa instruksi untuk mengerjakan variabel-variabel yang lebih besar ini.

8-bit jelas memadai untuk mengatasi port 8-bit. Ini juga cukup untuk berurusan dengan banyak loop counters, mengembalikan nilai, dan karakter ASCII. Itu tidak benar-benar cukup ketika berhadapan dengan angka. Int 8-bit yang ditandatangani (int8_t) hanya dapat mewakili -128 -> +127. Tidak ditandatangani (uint8_t) hanya dapat mewakili 0 -> 255.

Bilangan bulat 8-bit cukup terbatas. C / C ++ int harus mewakili setidaknya -32.678 -> +32.767 sehingga peta ke int16_t - ukuran terkecil yang akan melakukannya. Ini memberikan keseimbangan jangkauan dan efisiensi yang baik. Ini sangat penting ketika pemula sedang belajar - meluap bukan benar-benar sesuatu yang non-programmer mengerti.

Namun ada dampak kinerja dari melakukan ini, karena sebagian besar operasi 16-bit membutuhkan setidaknya dua kali lebih lama dari operasi 8-bit, dan menggunakan register dua kali lebih banyak. Ini mungkin atau mungkin tidak membuat perbedaan bagi Anda.

Banyak dari kita beralih ke tipe asli seperti int8_t dan uint8_t karena memberi Anda kontrol lebih jauh.

Cybergibbons
sumber
3
Hanya sebuah catatan: bukan Tim Arduino yang memetakan int ke int16_t, "int" adalah kata kunci yang dilindungi undang-undang C / C ++, dan pemetaan tipe adalah bagian dari ABI ( gcc.gnu.org/wiki/avr-gcc ) yang pengembang kompiler avr-gcc memutuskan untuk mengikuti. Perbedaan penting lainnya adalah pada tipe "ganda" yang biasanya lebar 64bit, sedangkan pada avr-gcc adalah 32bit seperti "float"
cmaglie
Terima kasih. Tidak yakin mengapa saya menulis itu. Saya tahu int harus mewakili 32.678 -> +32.767 (walaupun, sebenarnya, saya pikir ada kompiler berpemilik untuk salah satu prosesor NEC yang tidak mengikuti ini). Saya pikir itu karena saya tidak suka menyembunyikan lebar pada sistem embedded - menggunakan int16_t jauh lebih jelas.
Cybergibbons
1
+1 untuk penggunaan jenis asli yang jelas! Di Arduino Due, sebuah intadalah 32-bit! arduino.cc/en/Reference/int
Ron
3

Satu fakta penting tentang bahasa C dan C ++ adalah bahwa standar masing-masing tidak menentukan ukuran (dalam byte) dari tipe angka integral dan angka mengambang.

Mereka hanya mendefinisikan rentang minimal dan hubungan antara rentang ini, misalnya

range(short) <= range(int) < range(long)

Jadi ukuran eg intakan biasanya tergantung pada:

  • platform target (prosesor)
  • kompiler itu sendiri
jfpoilpret
sumber
Apakah Anda mengatakan sizeof(short) == sizeof(int) == sizeof(long)itu mungkin?
Ron
@ ron-e Secara teoritis, ya, itu mungkin. Namun dalam praktiknya, saya belum pernah melihat itu. Di sebagian besar kompiler / platform, orang bisa berharap (meskipun tidak dikenakan) itu sizeof(short) < sizeof(long).
jfpoilpret