우리는 다음과 같은 유형의 변수를 사용하여 할당을 가정 uint64를 사용하여 작업이 완료됩니다.컴파일러 독립 식 산술 변환 및 정수 프로모션
컴파일러는 표준 C 규칙에 따라 계산을 수행하기 전에 암시 적으로 두 uint16 및 uint32를 uint64로 승격시킬 예정입니까? 특히 다음 코드에서 두 번째 문을 적용하여
1) uint64 = uint16 + uint16 + uint32 + uint64
2) uint64 = uint64 + uint64 + uint64 + uint64
즉
:
또는 그 규칙은 두 UINT16 년대를 추가하는 등 처음으로 계산 될 수있는 결과를 알 때까지 곳이 유형의 승격되지 않을 것 다음이 추진 될 것이라고에만 즉시 좌과 연산 식의 우측에 적용 되는가 UINT32에,이 결과는, 등등 ...두 피연산자가 동일한 유형이있는 경우, 더 이상의 전환은 이 필요하지 않습니다. 두 피연산자가 정수 타입을 체결하거나 한 경우
그렇지 않으면, 모두 부호없는 정수 유형이 덜 정수 변환 계급의 종류와 피연산자 큰 순위와 피연산자의 유형으로 변환됩니다. 부호없는 정수의 형태를 갖는 피연산자 순위 크거나 다른 피연산자의 타입의 랭크와 동일 있는 경우
그렇지 않으면, 그 다음 부호있는 정수 유형 오퍼랜드 부호와 피연산자의 형태로 변환된다 정수 유형. 부호있는 정수 유형 오퍼랜드의 종류 는 부호 정수 타입 피연산자의 타입의 모든 값을 나타낼 수 있다면
그렇지 않으면, 다음의 부호없는 정수 유형 오퍼랜드는 유형에 변환되고 부호있는 정수 유형을 갖는 피연산자.
그렇지 않으면 두 피연산자 모두 부호있는 정수 유형의 피연산자 유형에 해당하는 부호없는 정수 유형 으로 변환됩니다.
즉
1) uint64 = uint16 + uint16 + uint32 + uint64
2) uint64 = (((uint16 + uint16) + uint32) + uint64)
3) uint64 = ((uint32 + uint32) + uint64)
4)
uint64 = (uint64 + uint64)
은 그 날이를 취소 할 수뿐만 아니라 모든 C 표준 규칙을 날 지점하시기 바랍니다.
의도 한 결과를 제공 재정렬 것이다 : 'UINT64 + UINT32 + UINT16 + uint16' 당량 '((UINT64 + UINT32) + UINT16) + uint16' 다음 UINT32가 UINT64에 promted 뒤에 행 uint16이 uint64로 승격되면서? – mcorley
@mcorley 네, 그렇습니다. – ouah