가능한 중복 : 출력 여기C 매크로 확장 및 정수 연산에 대한 혼란
#include<stdio.h> #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) printf("%d\n",array[d+1]); return 0; }
나는 다음 코드에 대한 몇 가지 질문을 코드의 배열 요소를 예상대로 인쇄하지 않습니다. 하지만 (int) 요소의 매크로 정의를
#define TOTAL_ELEMENTS (int) (sizeof(array)/sizeof(array[0]))
으로 추가하면 모든 배열 요소가 예상대로 표시됩니다.
- 이 형식 변환은 어떻게 작동합니까? 이를 바탕으로 는
나는 몇 가지 질문이있다 : 나는 몇 가지 매크로 정의가있는 경우
가그것이 뜻으로 모든 C에서 기본적으로
#define AA (-64)
, 매크로로 정의 된 상수는 인 경우 부호가있는입니다.
다음, 그래하지만 나는 (내가 UL, UD도 일을 시도 사용할 수있는 것보다 어떤 일정 접미사가 강제로 서명되지 않은 int로서 매크로없이 행동에서 정의 된 일부 일정을해야하는 경우)?
매크로 정의에서 unsigned int로 동작하도록 상수를 정의하려면 어떻게해야합니까?
@Skurmedel : 좋습니다. 하지만 만약 내가 매크로를 #define bb (-64 * (sizeof (int)/sizeof (int)) 으로 정의한 다음 bb를 사용하면 부호있는 int로 동작하고, unsigned int로 동작해야한다고 생각합니다. 왜냐하면 bb의 매크로 정의에는 부호있는 int와 부호없는 int의 곱셈이 있으므로 결과는 부호없는 int 여야합니다 (C promotion rules). 내가 잘못되었거나 누락 되었습니까? – goldenmean
C99 표준 (6.3.1.8)에 따라 : 그렇지 않으면 부호있는 정수 유형의 피연산자 유형이 부호가없는 정수 유형을 갖는 피연산자 유형의 모든 값 을 나타낼 수있는 경우 부호없는 정수 유형의 피연산자 부호있는 정수 유형을 갖는 피연산자의 유형으로 변환됩니다. sizeof가 부호있는 int로 표현할 수있는 값으로 부호없는 long을 반환하고 따라서 결과 유형이 서명 된 것 같습니다. – Skurmedel
위 섹션에서는 서명되지 않은 형식의 순위가 서명 된 형식보다 크거나 같은 경우 서명 된 형식이 서명되지 않은 형식으로 변환 될 것이라고 설명합니다. 즉, sizeof가 unsigned int를 반환하는 경우입니다. 그러나 컴파일러는 sizeof return unsigned long을 가질 수 있습니다. – Skurmedel