Saat menggunakan C / C ++ pada platform lain, int
tipenya biasanya 4 byte (atau berpotensi lebih). Namun, pada Arduino, hanya 2 byte.
Kenapa berbeda? Apakah itu mempengaruhi kinerja jika saya selalu menggunakan 4 byte long
saja?
Saat menggunakan C / C ++ pada platform lain, int
tipenya biasanya 4 byte (atau berpotensi lebih). Namun, pada Arduino, hanya 2 byte.
Kenapa berbeda? Apakah itu mempengaruhi kinerja jika saya selalu menggunakan 4 byte long
saja?
Jawaban:
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.
int
adalah 32-bit! arduino.cc/en/Reference/int
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 int
akan biasanya tergantung pada:
sizeof(short) == sizeof(int) == sizeof(long)
itu mungkin?
sizeof(short) < sizeof(long)
.
int
4 byte pada Arduino Due. Ashort
akan menjadi 2 byte pada semua Ardunios yang ada, tetapi saya menekankan saran orang lain untuk menggunakanint16_t
atauuint16_t
.