Arduino에서 데이터 유형 int와 long의 차이점

보이드 장애물 로봇 을위한 프로그래밍을 배우고 있었지만 long과 int의 두 가지 데이터 유형을 본 코드입니다.

Int는 -2,147,483,648에서 2,147,483,647까지 보유하는 데이터 유형입니다. Long은 -2,147,483,648에서 2,147,483,647까지를 보유하는 데이터 유형이기도합니다.

Int와 long은 동일하지만 아래와 같이 두 가지 유형의 데이터 유형이 사용되는 코드를 생각해 냈습니다.

int trigPin = 2; int echoPin = 4; long duration, cm, inches; 

하지만 언제 어떤 데이터 유형을 사용해야하는지 어떻게 알 수 있습니까? 웹에서 검색을 많이했지만 “이해가 안 돼서 누군가 제게 설명해 주 시겠어요?

댓글

  • " Int는 -2,147,483,648 ~ 2,147,483,647을 보유하는 데이터 유형입니다. " 어디서 들었습니까?

답변

Arduino (AVR 모델)에서 int는 32 비트가 아니라 16 비트입니다. 따라서 -32768에서 +32767로 이동합니다.

이것은 iv id = “와는 다릅니다 82d008b4c7 “>

(32 비트)

설명

  • intlong
  • int는 32 비트이며 long와 동일합니다. 예를 들어 여기 를 참조하세요.

답변

int 16 비트 , 32가 아님 .

답변

C 언어 사양에 따름 , int는 16 비트 이상이어야하며 long는 32 비트 이상이어야합니다.

컴파일러가 int를 32 비트 또는 64 비트로 구현하는 것은 괜찮습니다. 컴파일러가 long를 64 비트 이상으로 구현하는 것은 괜찮습니다. 그러나 컴파일러가 long를 16 비트로 구현하는 것은 허용되지 않습니다.

그러면 언제 어떤 유형을 사용해야합니까?

값이 16 비트 내에서 작업 할 수 있습니다. 그러면 int를 사용하는 것이 좋습니다. 16 비트 이상이 필요한 경우 long. 32 비트 이상이 필요한 경우 long long를 사용하십시오.

컴파일러 및 / 또는 CPU 사양에 얽매이지 마십시오. 다른 사람들이 언급했듯이 동일한 제품 범위 인 Arduinos, 16 비트 및 32 비트 CPU를 사용할 수 있습니다. 대신 표준에서 보장하는 것만 신뢰하십시오.

C 유형의 전체 사양은 다음과 같습니다.

  • char는 8 비트 이상이어야합니다.
  • int는 16 비트 이상이어야합니다.
  • long는 32 비트 이상이어야합니다.
  • long long는 64 비트 이상이어야합니다.

참고 : 컴파일러가 char, int, long 및 long long을 구현하는 것은 완벽하게 합법적입니다. 64 비트로. 사실 DSP 간에는 드문 일이 아닙니다.

댓글

  • 또한 : 컴파일러 문서 읽기
  • 그리고 : sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long). 따라서 int가 64 비트이면 long도 64 비트 이상이어야합니다.

답변

C에서와 같은 이유입니다. int 유형의 크기가 예상됩니다. 시스템이 가장 효율적으로 처리하는 자연스러운 단어 크기 여야합니다. 또한 너비가 16 비트 이상이어야하며 short보다 작아서는 안되며 더 크지 않아야합니다. long보다.

따라서 int는 16 비트, 32 비트 또는 64 비트가 될 수 있습니다. 시스템이 가장 잘 처리하는 것이 무엇이든간에 8 비트 또는 16 비트 CPU에서는 16 비트, 32 비트 CPU에서는 32 비트가 될 가능성이 가장 높습니다.

int 최고의 성능을 원할 때 16 비트가 제공하는 것보다 더 많은 범위가 필요할 때주의를 기울이면서 보호합니다. 요즘에는 16 비트 시스템 용 응용 프로그램 코드를 작성할 때를 아는 경향이 있습니다. 이식성이있을 수있는 “라이브러리”코드에 대해서는 그렇지 않지만 더 큰 관심사입니다.

귀하의 예에서 저자가 유형을 신중하게 선택했다고 가정하면 int 변수는 아마도 작은 범위를 필요로하고 단어 크기를 감당할 수 있습니다. , 잠재적으로 더 짧거나 더 빠른 코드 (또는 둘 다)로 이어집니다. long 파일에는 아마도 16 비트 이상의 범위가 필요했습니다 (최소 32 비트 너비가 보장됨). 컴파일 대상으로 선택한 프로세서에서 intlong가 모두 32 비트로 구현 된 것 같습니다. 16 비트 대상 CPU를 선택한 경우 달라야합니다 (또는 해야 합니다).

답변

stdint.h의 유형을 사용하고 싶습니다.

사소한 단점이 있지만 다른 아키텍처에서 컴파일 할 때도 처리중인 크기를 정확히 알고 있다는 이점이 있습니다.

#include <stdint.h> uint8_t my_byte = 0xf0; int16_t trig_pin = 2; int16_t echo_pin = 4; uint32_t duration, cm , blah; uint64_t big_int; // etc. 

하지만 데이터에 int16_t 만 필요할 때 int32_t 무리를 이동하고 싶지는 않습니다.

댓글

  • 따라서 기계어를 사용하지 않습니다. 크기가 AVR의 성능에 영향을주지 않습니까?
  • @Ren é-일반적으로 워드 크기를 사용하지 않으면 대부분의 CPU에서 성능에 영향을 미칠 수 있습니다. 그러나 일반적으로 AVR CPU에는 8 비트 레지스터가 있습니다. & 포인터 작업을위한 16 비트 명령어가있는 누산기입니다. 따라서 프로그래밍 할 때 코드를 먼저 실행 한 다음 만약 속도를 최적화합니다 '가 너무 느립니다.
  • @Ren é-하지만 정말 현명하게보고 싶다면 다음을 사용할 수 있습니다. 데이터 유형으로 word. 이것은 Arduino Uno에서 16 비트이고 Arduino Due & Zero에서 32 비트입니다. 그러나 이것은 실제로 데이터 유형의 최소 크기 만 아는 문제로 돌아옵니다. 일부 Due 코드에서 word를 사용했지만 Uno로 백 포트하고 싶으십니까?! 대신 uint32_t를 사용하면 시작하기 전에이 문제를 해결할 수 있지만, 그렇습니다. Uno에서는 단어 크기가 차선책입니다. 미래 Arduino 보드는 어떻습니까? 단어 크기는 어떻습니까? 32? 64? 128!?
  • 좋습니다. 따라서 하한이 충분하면 기계어 크기 (int? WORD는 명확한 Windows 유형 정의 인 것 같음)를 사용합니다. 메모리 크기는 신경 쓰지 않고 속도가 필요합니다. 크기에 신경 쓰면 * _t?
  • 스크랩 … gnu.org/software/libc/manual/html_node/Integers.html *fast*_t가 갈 길인 것 같습니다 …

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다