2013-04-23 2 views
1

iPhone 샘플 프로젝트 (Xcode IDE, Apple LLVM 컴파일러 4.2)의 코드를 읽었습니다.C 언어의 열거 형 선언에서 0x80000000이라는 16 진수 표현의 의미

typedef enum _Application_Events 
{ 
    EVENT_EXIT = 0x80000000, 
    EVENT_TOUCH, 
    EVENT_DRAG, 
    EVENT_RELEASE_TOUCH, 
    EVENT_ROTATE_0, 
    EVENT_ROTATE_90, 
    EVENT_ROTATE_180, 
    EVENT_ROTATE_270 
} Application_Events; 

나는 이러한 이벤트에 할당되는 값의 종류를 이해하지 않는다 : 그 아이폰 샘플 프로젝트 (C로 작성) 외부 라이브러리의 헤더 파일에서 일부 이벤트는 열거 형 선언 거기 . 0x80000000은 큰 양의 정수 (2147483648) 또는 음수의 0 또는 음의 정수 (-2147483648)로되어 있습니까?

내가 애플 LLVM 컴파일러 4.2 인 컴파일러, 엑스 코드 디버거에서 검사의 EVENT_EXIT(int) -2147483648 동일하고 EVENT_RELEASE_TOUCH 등등 (int) -2147483645과 같습니다.

외관상으로는 two's complement 표현으로 처리됩니다. 관련 게시물은 here입니다.

하지만 이들은 지금은 확실하지 않다 무엇을 :

(1) 0x80000000에 대한 기본 데이터 유형은 항상 int 또는 다른 상황에서 뭔가 다른 것을? 이것은 컴파일러 나 플랫폼에 달려 있습니까?

(2) 16 진수 값을 이와 같이 부호있는 정수로 지정한 경우 항상 2의 보수 표현으로 해석됩니까? 이것은 컴파일러 나 플랫폼에 달려 있습니까? 관련 게시물은 here입니다. 또 다른 참고 자료는 here입니다.

몇 가지 아이디어를 알려주십시오. 모두 감사합니다. D

+1

다음 질문에 답하려면 : (1) C 플랫폼을 참조하는 다른 답변에 따라 플랫폼에 따라 다릅니다. 그러나 일반적으로 int입니다. (2) 캐스팅 또는 접미어로 형식을 지정하지 않으면 컴파일러에서 숫자가 부호있는 int라고 가정합니다. 16 진수 값은 그 자체로 양수도 아니고 음수도 아니므로 비트 패턴이므로 상위 비트가 설정되면 값은 음수로 간주되므로 서명 된 유형에 할당하면 음수가되지만 할당하면 그것은 부호없는 타입으로 여러분이 기대하는 자연스러운 가치를 가질 것입니다. – PaulProgrammer

답변

3

C와 유사한 언어의 많은 것들과 마찬가지로 열거 형은 정수입니다. 이와 같이 첫 번째 값을 설정하면 컴파일러가 증가하여 모든 열거 형 값이 0보다 작아집니다 (부호있는 정수 2로 설정하면 상위 비트가 음수를 나타냅니다)

가능성 있음 프로그래머는 다양한 종류의 이벤트를 보낼 수 있도록이 값을 선택 했으므로 다른 사람들과 충돌해서는 안됩니다.

요약하면 실제 값은 걱정하지 마세요. 그것은 단지 숫자입니다.이름을 사용하고 그 코드를 사용하거나 반환하는 호출의 의미에서 의미가있는 것으로 이해하십시오.

+0

감사합니다 PaulProgrammer! 위 코드 조각의 원래 프로그래머가'0x00','0x01' 등의 양의 정수인 다른 플래그와의 충돌을 피하려고 노력했다는 것에 동의합니다. – Cong

2

열거 형의 기본 유형은 구현에 따라 정의됩니다. 이 경우 기본 형식은 unsigned int이어야합니다. 표준에서는 컴파일러가 모든 열거 형 값을 포함 할만큼 충분히 넓은 기본 형식을 선택해야하기 때문입니다. C99 표준에서 섹션 6.7.2.2.4 :

각 열거 형은 char, 부호있는 정수 유형 또는 부호없는 정수 유형과 호환되어야한다. 유형의 선택은 구현 정의, 108)이지만 열거의 모든 구성원의 값을 나타낼 수 있어야합니다. 열거 형은 열거 자 선언 목록을 끝내는 }이 끝날 때까지 불완전합니다.

108) 모두 열거 상수 볼 때까지 구현이되는 정수형의 선택을 지연시킬 수있다.

+0

C99 표준 (여기서 찾을 수 있습니다 (http://cs.nyu.edu/courses/spring13/CSCI-GA.2110-001/downloads/C99.pdf)), 섹션 6.7.2.2.4는 페이지에 있습니다 105. – Cong

1

enum의 기본 유형은 보유해야하는 값에 따라 다릅니다. 컴파일러는 그 타입이 궁극적으로 어떻게 정의 될지에 대한 약간의 위도를 가지고있다. 귀하의 경우 Application_Events의 기본 유형은 보다 커서 int은 32 비트 (일반적으로 enum)라고 가정하기 때문에 unsigned int입니다. 그러나 무엇인가 :

enum foo_t { 
    FOO_Start, 
    FOO_Thing, 
    FOO_Another_Thing, 
    FOO_End 
}; 

enum foo_t의 유형은 int 또는 unsigned int 수 있습니다.

그러나 열거 (EVENT_EXIT, FOO_Start 등 예컨대) 형의 int이다 상수. 그게 당신이 디버거에서보고있는 것입니다. 당신이

Application_Events foo = EVENT_EXIT; 

뭔가를 할 경우 foo의 유형은 unsigned을 수 있습니다. 이 질문은 조금 바뀌 었다고 생각합니다.

1) iPhone의 경우 상수 0x80000000unsigned (iPhone ARM 프로세서는 32 비트 int 초)입니다. 가치는 플랫폼 및 사용 된 C 버전에 따라 다릅니다.

2) 실제로 현실적으로, 대부분의 플랫폼에서 사용하기 때문에 프로세서가 2의 보수 연산을 지원한다고 가정 할 수 있습니다. C 언어 그 자체가 이 아니고,이 아니라는 것을 보장합니다. 다른 산술 방식 (1의 보수, 부호가있는 크기)이 허용됩니다.

+0

감사합니다. ldav1s! 하지만 제 경우에는'Application_Events'가 위의'enum' 유형과 함께 정의되고 Xcode의 디버거는'int' 유형이라고 알려줍니다. – Cong

1
  1. enum 유형은 int입니다.
  2. 0x80000000은 숫자이지만 16 진수입니다. 이 값은 디버거 (또는 16 진수에서 10 진수 변환기로)에서 확인한 값입니다.
  3. enum이 작동하는 방식은 값이 명시 적으로 할당 된 값에서 점진적으로 할당된다는 것입니다. 따라서이 경우 열거 형은 EVENT_EXIT = 0x80000000, EVENT_TOUCH = 0x80000001, EVENT_DRAG = 0x80000002 등으로 할당됩니다.
+0

고맙습니다. "enum은 int 형"을 지원하는 참조가 있습니까? – Cong