İnt neden sadece 2 byte?


9

C / C ++ diğer platformlarda kullanıldığında, inttür genellikle 4 bayttır (veya daha fazla). Ancak, Arduino'da sadece 2 bayt.

Neden farklı? longBunun yerine her zaman 4 bayt kullanırsam performansı etkiler mi?


2
intArduino Due 4 bayt olduğunu unutmayın . A shortmevcut tüm Ardunios 2 byte olacak ama ben kullanımına başkalarının tavsiyesi vurgulamak int16_tveya uint16_t.
Ron

Yanıtlar:


10

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.


3
Sadece bir not: int'i int16_t ile eşleyen Arduino Ekibi değil, "int" C / C ++ ayrılmış bir anahtar kelimedir ve tür eşleme ABI'nin ( gcc.gnu.org/wiki/avr-gcc ) bir parçasıdır. avr-gcc derleyicisinin geliştiricileri takip etmeye karar verdi. Bir diğer önemli fark genellikle 64bit genişliğinde "çift" tipinde, avr-
gcc'de

Teşekkürler. Bunu neden yazdığımdan emin değilim. İnt 32.678 -> +32.767'yi temsil etmelidir (gerçi, aslında, bunu takip etmeyen NEC işlemcilerinden biri için özel bir derleyici olduğunu düşünüyorum). Bence bunun nedeni gömülü sistemlerde genişliklerin gizlenmesini sevmiyorum - int16_t kullanmak çok daha net.
Cybergibbons

1
Net yerel türlerin kullanımı için +1! Arduino Due'de bir int32-bit! arduino.cc/tr/Reference/int
Ron

3

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 intgenellikle aşağıdakilere bağlıdır:

  • hedef platform (işlemci)
  • derleyicinin kendisi

sizeof(short) == sizeof(int) == sizeof(long)mümkün mü diyorsun
Ron

@ ron-e Teorik olarak, evet, bu mümkün olurdu. Ancak pratikte bunu hiç görmedim. Çoğu derleyici / platformda, kişi bunu (dayatılmasa da) bekleyebilirdi sizeof(short) < sizeof(long).
jfpoilpret
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.