2013-07-28 4 views
1

변수 "정수"를 정의하는 경우 PIC 마이크로 컨트롤러에서 동일한 "int"변수 Atmel 마이크로 컨트롤러를 정의 할 때 같은 크기가됩니까? 아니면 다른 크기가 될 것인가?다른 마이크로 컨트롤러의 변수 크기가 동일합니까?

이 질문은 임베디드 시스템 인터뷰에서 어떻게 대답해야합니까?

조금 혼란 스럽네요 !!

마이크로 컨트롤러 또는 프로그래밍 언어에 따라 달라 집니까? 정수 같은 유형의 변수는 모든 다른 프로그래밍 언어에서 같은 크기입니까 ??

이것은 임베디드 컨트롤러에서 약간 다른 점입니다.

+0

가능한 [내 컴퓨터와 Arduino의 다른 int 크기] (http://stackoverflow.com/questions/3294816/different-int-sizes-on-my-computer-and-arduino) 및 [크기 int in C, 다른 아키텍쳐] (http://stackoverflow.com/questions/1611733/size-of-int-in-c-on-different-architectures)와 [int, long 등의 크기] (http : //stackoverflow.com/questions/589575/size-of-int-long-etc) –

+0

프로세서, 언어 및 컴파일러에 따라 다릅니다. 사이즈가 맞거나 다를 수있는 한 프로세서에서 다른 프로세서로의 기대치가 없어야합니다. –

+0

@Ayman Younis - 임베디드 컨트롤러는 ANSI-C 표준에 특별한 것이 아니기 때문에 여전히 같은 질문입니다. – jeb

답변

6

인터뷰 질문에 대한 답변은해야 뭔가처럼!

가능성이있는 곳에서는 stdint.h에 정의 된 유형을 사용해야하며, 그렇지 않으면 컴파일러 설명서를 참조하거나 limits.h의 정의를 검사해야합니다.

면접관은 어떤 경우에 면접 상황에서 이러한 간결성을 감사하지 것 예를 위해 아마/아무 대답도 및 요청되지 않을 수 있습니다 - 질문은 당신이 뭔가 유용하거나 재미있는 말했다 때까지 이야기 취득하기위한 것입니다 너 자신이나 당신의 능력과 지식에 대해서. 그가 아마도 찾고있는 것은 C의 표준 유형 크기가 컴파일러/아키텍처 의존성이라는 사실과 이식 가능한 코드의 잠재적 가변성을 처리하는 방법을 알고 있는지 여부입니다.

하나의 PIC와 다른 PIC 또는 하나의 Atmel 및 다른 하나 사이의 int는 PIC와 Atmel 사이에 다른 점이있을 가능성이 높습니다.예를 들어 Atmel AVR32는 8 비트 AVR과 확실히 다르며 유사하게 MIPS 기반 PIC32는 "클래식"PIC와 다릅니다.

또한 내장 된 유형의 크기는 엄격하게 "컴파일러 구현"문제이므로 동일한 프로세서에 대한 두 개의 다른 컴파일러가 다를 수 있습니다 (컴파일러 공급 업체가 현저하게 벗어날 수 없으므로 그 길은 비뚤어지게됩니다!).

C 및 C++ (물론 어셈블러) 이외의 언어는 최소한의 런타임 환경 요구 사항을 가진 시스템 수준 언어이기 때문에 소형 마이크로 컨트롤러에서는 덜 일반적이지만 유형의 크기는 언어 정의에 따라 달라질 수 있습니다.

1

아키텍처에 따라 32 비트 또는 64 비트가 다릅니다.

값 64 -2,147,483,648과 2,147,483,647

64 비트 시스템에서이 될 것입니다 :

부호있는 정수 32 비트에 대한

: 비트 시스템 (32)에, 당신의 정수는 32 비트에 코딩 할 것

부호있는 정수 64 비트의 경우 : -9223372036854775808과 9223372036854775807 사이의 값

그래서 정수형은 사용자가 사용하는 아키텍처에 따라 크기가 다를 수 있습니다. 지.

+0

네,하지만 그렇게 간단하지는 않습니다. 8 비트 및 16 비트 프로세서는 임베디드 분야에서 여전히 일반적입니다. 16 비트 프로세서는 프로세서가 단일 연산으로 처리 할 수 ​​없더라도 편의상 16 비트 int 또는 int가 32 비트 일 수 있음을 암시 할 수 있습니다. 이는 궁극적으로 ABI와 같은 컴파일러 및 계약의 요소입니다 하드웨어가 아닙니다. –

+0

32 비트 및 64 비트 시스템에서는 그렇게 간단하지 않습니다. 64 비트 Linux ABI에서 'int'는 64 비트이지만 Win64에서는 32 비트를 유지합니다. – Clifford

2

표준 C 유형은 구현마다 다를 수 있습니다. stdint.h에있는 유형을 사용하면 원하는 비트 수를 지정할 수 있습니다.

1

TIP :

컴파일 시간 동안
#define C_ASSERT(cond) char c_assert_var_##__LINE__[(cond) ? 1 : -1] 
C_ASSERT(sizeof(int) == 4); 

이 다음과 같은 코드를 생성합니다 :

특정 유형은 특정 크기라고 가정 코드가있는 경우 컴파일시 이러한 가정을 확인할 수 있습니다 컴파일되지 않습니다
char c_assert_var_350[(sizeof(int) == 4) ? 1 : -1]; 

는 sizeof (int)를하는 경우 = 4

1

많은 것들에 달려 있지만, 나는 그렇다고 할 수도없고 대답 할 수도 없다. 그러나 나의 대답은 더 아니다.

int은 16 비트가 보장됩니다. 그러나 많은 후자의 아키텍처 int은 32 비트 숫자이며 규칙을 위반하지 않습니다. 지금까지 내가 Atmels 8 비트 마이크로 컨트롤러에서 무엇을 알고 int는 PIC에 대해 확실하지 않은 16 비트입니다.

어쨌든, 내 제안은 정의 된 유형을 사용하는 것입니다. 어떤 컴파일러를 사용하고 있는지 모르지만 AVR Studio를 사용하고 있습니다.

uint8_t 
int8_t 
uint16_t 
... 
int64_t 

이러한 유형의 모든 프로세서에서 동일한 크기가 보장되므로 컴파일러를 통해 조금만 조사해야합니다.

관련 문제