보이드 장애물 로봇 을위한 프로그래밍을 배우고 있었지만 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 비트)
설명
-
int
및long
-
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 비트 너비가 보장됨). 컴파일 대상으로 선택한 프로세서에서 int
및 long
가 모두 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
가 갈 길인 것 같습니다 …