2017-09-17 12 views
1

C에서 함수 인수의 형식 승격에 대한 이해는 유형이 char 또는 short 인 프로토 타입이 아닌 함수를 호출하면 해당 함수가 int.
질문 : long을 인수로 사용하고 sizeof(long) > sizeof(int)으로 전화하면 어떻게됩니까?Type Promotion in C, 인수로 long 전달하기

매개 변수가 long으로 전달 된 경우 모든 통합 매개 변수를 승격해야하는 유형으로 long을 선택하지 않는 이유는 무엇입니까? 인수의 형식 승격 뒤에 이유가 아니라, 컴파일러가 스택에 푸시 된 매개 변수를 모두 동일한 길이로 만듦으로써 컴파일러를 더 간단하게 만드는 것입니다. 따라서 런타임 시스템은 매개 변수의 수만 알아야하므로 귀찮은 것이 아닙니다. 그들의 크기는?

+2

"프로토 타입이 아닌 함수를 호출하면"하지 마십시오. 그건 어떤 유형 홍보가 아니거나위한 것입니다. 이 경우, 컴파일러는 추측해야하고 당신이 제공하는 매개 변수에 대해 "아마도 int"보다 더 나은 것을 추측 할 수 없습니다. 다른 한편으로 타입 프로모션은 알려져 있지만 다른 타입의 하나 이상의 피연산자 (예를 들어, "+", "-", ....)를 처리 할 때 사용되며, 여기서 하나는 다른 것보다 "작다". 작은 것이 다른 유형으로 승격됩니다. 프로토 타입 함수 (알려진 매개 변수 유형이있는 경우)를 호출하면 매개 변수가 "작음"유형 인 경우 유형 승격을 얻을 수 있습니다. – Yunnosch

+1

@Yunnosch "는"아마 int "보다 더 나은 것을 추측 할 수 없습니다. 실제로 float의 경우"double "을 추측 할 수 있습니다. –

+0

"인수의 형식 승격 뒤에있는 이유가 아닙니다. 컴파일러를 더 간단하게 작성하는 것입니다."-> 프로모션은 더 좁은/더 빠르게 프로세서의 좁은 유형을 "기본"(다소간) 정수 유형으로 가져 오는 것입니다. 암호. – chux

답변

3

long을 선택하지 왜 ...

디자인 생성 된 "int이 모든 것을 추진"할 때 long이 존재하지 않았기 때문에

.

이제는 기본 프로모션 규칙을 변경하면 기존 C 코드의 모든 비트가 깨지므로 printf()open()과 같은 통화 동작이 변경됩니다.

임의의 varargs 유형 함수가 영향을받습니다 (open() 포함). 다른 미묘한 문제가있을 수 있지만 "모든 것에 대한 단절"은 그렇게하지 않는 충분한 이유입니다.