C / C ++ diğer platformlarda kullanıldığında, int
tür genellikle 4 bayttır (veya daha fazla). Ancak, Arduino'da sadece 2 bayt.
Neden farklı? long
Bunun yerine her zaman 4 bayt kullanırsam performansı etkiler mi?
C / C ++ diğer platformlarda kullanıldığında, int
tür genellikle 4 bayttır (veya daha fazla). Ancak, Arduino'da sadece 2 bayt.
Neden farklı? long
Bunun yerine her zaman 4 bayt kullanırsam performansı etkiler mi?
Yanıtlar:
Birçok Arduinos'da kullanılan ATmega328, 8 bitlik bir mikrodenetleyicidir. Bu, kayıtların 8 bit, veri yolu 8 bit, portların 8 bit olduğu anlamına gelir. Sistemin bazı minimum 16 bit yönleri vardır (örneğin zamanlayıcılardan biri), ancak neredeyse her şey 8 bittir.
Bu nedenle, çoğu işlem bir seferde 8 bit kullanır. 8 bit dışında herhangi bir şey üzerinde çalışmak (yani 16 bit veya 32 bit tamsayılar ve kayan nokta sayıları), temel olarak yazılım öykünmesi olarak tanımlanabilecek şeyleri gerektirir, burada derleyici bu daha büyük değişkenler üzerinde çalışmak için birden fazla komut kullanır.
8 bitlik, 8 bitlik bir bağlantı noktasını ele almak için yeterlidir. Ayrıca birçok döngü sayacı, dönüş değeri ve ASCII karakteriyle başa çıkmak yeterlidir. Rakamlarla uğraşırken gerçekten yeterli değil. İşaretli bir 8 bit int (int8_t) yalnızca -128 -> +127'yi temsil edebilir. İmzasız (uint8_t) yalnızca 0 -> 255'i temsil edebilir.
8 bitlik tamsayılar oldukça sınırlayıcıdır. C / C ++ int en az -32,678 -> +32,767'yi temsil etmelidir, bu nedenle int16_t ile eşleşir - bunu yapacak en küçük boyut. Bu, menzil ve verimlilik arasında iyi bir denge sağlar. Bu özellikle yeni başlayanlar öğrenirken önemlidir - taşma gerçekten programcı olmayanların anladığı bir şey değildir.
Bununla birlikte, performansın bir etkisi vardır, çünkü 16 bitlik işlemlerin çoğu 8 bitlik işlemden en az iki kat daha uzun sürer ve iki kat daha fazla kayıt kullanır. Bu sizin için bir fark yaratabilir veya etmeyebilir.
Birçoğumuz size çok daha fazla kontrol sağladığı için int8_t ve uint8_t gibi yerel türlere geçiyoruz.
int
32-bit! arduino.cc/tr/Reference/int
C ve C ++ dilleri hakkında önemli bir gerçek, ilgili standartlarının integral ve kayan nokta sayısı tiplerinin boyutunu (bayt cinsinden) tanımlamamasıdır.
Sadece minimum aralıkları ve bu aralıklar arasındaki ilişkiyi tanımlarlar, ör.
range(short) <= range(int) < range(long)
Yani, örneğin bir büyüklüğünün boyutu int
genellikle aşağıdakilere bağlıdır:
sizeof(short) == sizeof(int) == sizeof(long)
mümkün mü diyorsun
sizeof(short) < sizeof(long)
.
int
Arduino Due 4 bayt olduğunu unutmayın . Ashort
mevcut tüm Ardunios 2 byte olacak ama ben kullanımına başkalarının tavsiyesi vurgulamakint16_t
veyauint16_t
.