เมื่อใช้ C / C ++ บนแพลตฟอร์มอื่น ๆint
โดยทั่วไปจะเป็นประเภท 4 ไบต์ (หรือมากกว่านั้น) อย่างไรก็ตามบน Arduino มันมีเพียง 2 ไบต์
ทำไมถึงแตกต่าง มันส่งผลกระทบต่อประสิทธิภาพการทำงานหรือไม่ถ้าฉันใช้ 4 ไบต์long
แทน
เมื่อใช้ C / C ++ บนแพลตฟอร์มอื่น ๆint
โดยทั่วไปจะเป็นประเภท 4 ไบต์ (หรือมากกว่านั้น) อย่างไรก็ตามบน Arduino มันมีเพียง 2 ไบต์
ทำไมถึงแตกต่าง มันส่งผลกระทบต่อประสิทธิภาพการทำงานหรือไม่ถ้าฉันใช้ 4 ไบต์long
แทน
คำตอบ:
ATmega328 ที่ใช้ใน Arduinos เป็นไมโครคอนโทรลเลอร์ขนาด 8 บิต ซึ่งหมายความว่าการลงทะเบียนคือ 8 บิตบัสข้อมูลคือ 8 บิตพอร์ตเป็น 8 บิต มีบางแง่มุม 16 บิตขั้นต่ำสำหรับระบบ (เช่นหนึ่งในตัวนับ) แต่เกือบทุกอย่างคือ 8 บิต
ดังนั้นการดำเนินการส่วนใหญ่จัดการ 8 บิตในเวลา การทำงานกับอะไรก็ตามยกเว้น 8 บิต (เช่นจำนวนเต็ม 16 บิตหรือ 32 บิตและตัวเลขทศนิยม) จำเป็นต้องมีสิ่งที่สามารถอธิบายได้ว่าเป็นซอฟต์แวร์การจำลองซึ่งคอมไพเลอร์ใช้คำสั่งหลายคำสั่งเพื่อทำงานกับตัวแปรขนาดใหญ่เหล่านี้
เห็นได้ชัดว่า 8 บิตนั้นเพียงพอสำหรับการระบุที่อยู่พอร์ต 8 บิต นอกจากนี้ยังเพียงพอที่จะจัดการกับตัวนับลูปค่าส่งคืนและอักขระ ASCII จำนวนมาก มันไม่พอจริง ๆ เมื่อจัดการกับตัวเลข 8-bit int ที่ลงนามแล้ว (int8_t) สามารถแสดงได้เพียง -128 -> +127 ไม่ได้ลงชื่อ (uint8_t) สามารถแสดง 0 -> 255 เท่านั้น
จำนวนเต็ม 8 บิตค่อนข้าง จำกัด C / C ++ int ต้องแสดงอย่างน้อย -32,678 -> +32,767 ดังนั้นแมปกับ int16_t - ขนาดที่เล็กที่สุดที่จะทำ สิ่งนี้ให้สมดุลที่ดีของช่วงและประสิทธิภาพ สิ่งนี้มีความสำคัญอย่างยิ่งเมื่อผู้เริ่มต้นเรียนรู้ - การมีน้ำล้นไม่ใช่สิ่งที่โปรแกรมเมอร์ไม่เข้าใจจริงๆ
มีผลกระทบต่อประสิทธิภาพการทำงานเนื่องจากการดำเนินการ 16 บิตส่วนใหญ่ใช้เวลาอย่างน้อยสองเท่าของการทำงาน 8 บิตและใช้การลงทะเบียนสองเท่า สิ่งนี้อาจหรือไม่อาจสร้างความแตกต่างให้กับคุณ
พวกเราหลายคนเปลี่ยนไปใช้ประเภทเนทิฟเช่น int8_t และ uint8_t เพราะมันช่วยให้คุณควบคุมได้มากขึ้น
int
32 บิต! arduino.cc/en/Reference/int
ข้อเท็จจริงที่สำคัญประการหนึ่งเกี่ยวกับภาษา C และ C ++ คือมาตรฐานที่เกี่ยวข้องไม่ได้กำหนดขนาด (เป็นไบต์) ของชนิดหมายเลขหนึ่งและจุดลอยตัว
พวกเขาเพียงแค่กำหนดช่วงที่น้อยที่สุดและความสัมพันธ์ระหว่างช่วงเหล่านี้เช่น
range(short) <= range(int) < range(long)
ดังนั้นขนาดของเช่นint
จะโดยทั่วไปจะขึ้นอยู่กับ:
sizeof(short) == sizeof(int) == sizeof(long)
เป็นไปได้?
sizeof(short) < sizeof(long)
ได้
int
เป็น 4 ไบต์บน Arduino Dueshort
จะมี 2 ไบต์ในทุก Ardunios ที่มีอยู่ แต่ผมเน้นคำแนะนำของผู้อื่นเพื่อการใช้งานหรือint16_t
uint16_t