왜 int가 2 바이트입니까?


9

다른 플랫폼에서 C / C ++를 사용하는 경우 int유형은 일반적으로 4 바이트 (또는 잠재적으로 더 많음)입니다. 그러나 Arduino에서는 2 바이트입니다.

왜 다른가요? 항상 4 바이트를 long대신 사용하면 성능에 영향을 줍니까 ?


2
참고 int아두 이노 때문에 4 바이트입니다. A short는 기존의 모든 Ardunios에서 2 바이트이지만, 다른 사람들의 조언 int16_t이나 사용을 강조합니다 uint16_t.
Ron

답변:


10

많은 Arduino에 사용되는 ATmega328은 8 비트 마이크로 컨트롤러입니다. 이는 레지스터가 8 비트이고 데이터 버스가 8 비트이며 포트가 8 비트임을 의미합니다. 시스템에는 약간의 16 비트 측면 (예 : 타이머 중 하나)이 있지만 거의 모든 것이 8 비트입니다.

따라서 대부분의 작업은 한 번에 8 비트를 처리합니다. 8 비트 (예 : 16 비트 또는 32 비트 정수 및 부동 소수점 숫자)를 제외한 모든 작업을 수행하려면 소프트웨어 에뮬레이션으로 설명 할 수있는 것이 필요합니다. 여기서 컴파일러는 이러한 큰 변수에 대해 여러 명령을 사용합니다.

8 비트는 8 비트 포트를 처리하는 데 적합합니다. 또한 많은 루프 카운터, 반환 값 및 ASCII 문자를 처리하기에 충분합니다. 숫자를 다룰 때는 충분하지 않습니다. 부호있는 8 비트 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와 같은 기본 유형으로 전환하여 훨씬 더 많은 제어 기능을 제공합니다.


3
참고 : int를 int16_t에 매핑 한 것은 Arduino 팀이 아니며 "int"는 C / C ++ 예약 키워드이며 유형 매핑은 ABI ( gcc.gnu.org/wiki/avr-gcc )의 일부입니다. avr-gcc 컴파일러의 개발자가 따르기로 결정했습니다. 또 다른 주목할만한 차이점은 AVR-GCC에서 32 비트는 "부동"와 같은 상태에서 보통 64 비트가 넓은이라는 "더블"타입에
cmaglie

감사. 내가 왜 썼는지 모르겠습니다. int는 32,678-> +32,767을 나타내야한다는 것을 알고 있습니다 (실제로이를 따르지 않은 NEC 프로세서 중 하나의 독점 컴파일러가 있다고 생각합니다). 임베디드 시스템에서 너비를 숨기는 것을 좋아하지 않기 때문에 int16_t를 사용하는 것이 훨씬 명확합니다.
Cybergibbons

1
명확한 기본 유형을 사용하려면 +1! Arduino Due에서 int32 비트입니다! arduino.cc/ko/Reference/int
Ron

3

C 및 C ++ 언어에 대한 중요한 사실 중 하나는 해당 표준이 정수 및 부동 소수점 숫자 유형의 크기 (바이트)를 정의하지 않는다는 것입니다.

그들은 단지 최소 범위와 이러한 범위 사이의 관계를 정의합니다.

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

따라서 예를 들어 int의지 의 크기 는 일반적으로 다음에 달려 있습니다.

  • 대상 플랫폼 (프로세서)
  • 컴파일러 자체

당신 sizeof(short) == sizeof(int) == sizeof(long)은 가능 하다고 말하는가 ?
Ron

@ ron-e 이론적으로는 가능할 것입니다. 그러나 실제로는 본 적이 없습니다. 대부분의 컴파일러 / 플랫폼에서 (강제되지는 않았지만) 기대할 수 sizeof(short) < sizeof(long)있습니다.
jfpoilpret
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.