2011-04-10 5 views
1

예를 들어 float 유형의 변수에 f를 추가하지 않으면 대부분의 컴파일러가 신경 쓰지 않는다고 생각합니다. 그러나 내가 할 수있는만큼 명확하고 정확하게하려고하기 때문에 올바른 유형을 표현하고 싶습니다.리터럴 피연산자 유형

다른 유형의 두 개의 리터럴 피연산자 결과의 유형은 무엇입니까? 아니면 상황에 따라 달라 집니까? 예컨대 :

int i=1.0f/1; 
float f=1.0f/1; 

컴파일러는이 두 경우에 불평하지 않을 때문에 문자 유형 또는 작업의 결과 유형은 항상 상황에 따라 변환됩니다 때문에 관대보기의 그것입니까?

답변

1

첫 번째 것은 부동 소수점을 int로 나눕니다.이 경우 항상 float이됩니다 (float으로 int를 나눌 때도 마찬가지 임). 이 float 결과는 int로 변환되어 i에 저장됩니다.

두 번째는 연산 결과 인 float을 가져 와서 float 변수에 할당하여 floatness를 유지합니다.

여기에는 두 가지 별도의 문제가 있습니다. 접미사가 있거나없는 리터럴이 컴파일러에서 어떻게 해석되는지와 혼합 된 숫자 유형에서 수행 된 연산 결과.

5

먼저 컴파일러는 f 접미어를 신경 씁니다. 1.0은 두 배입니다. 1.0f은 float입니다. 예를 들어 :

printf("%.15f %.15f\n", 0.1f, 0.1); 

0.100000001490116 0.100000000000000가 생성 (두 번째 숫자는 실제 0.1 제보다 더 아니라고 적어, 그것은 단지 가깝다).

이 숫자는 표현할 수없는 수 있으며, 무엇을 결정하기 위해뿐만 아니라이 상수에 관여 작업의 유형을 결정뿐만 아니라 중요한 예를 들면 :.

printf("%.15f %.15f\n", 1.0f/10.0f, 1.0/10.0); 

가 이전과 같은 출력을 생성합니다. 여기에서 주목해야 할 중요한 점은 1과 10은 모두 floatdouble처럼 정확하게 나타낼 수 있다는 것입니다. 우리가 보는 것은 리터럴 레벨에서 반올림하는 것이 아니라 피연산자 유형에서 연산 유형을 결정하는 것입니다.

컴파일러가 예제에 대해 관대하지 않습니다. 그들은 the relevant standard, 특히 6.3.1.4 및 6.3.1.5 절에서 찾을 수있는 규칙을 엄격하게 적용하고 있습니다.

0

리터럴의 유형이 다른 상황에서 중요하다 (예를 들어, f을 가정하는 것은 float입니다) : 어떤 컴파일러는 둘 다 동일한 코드를 생성하는 편안한 모드를 제공

f = f + 1.0;  // Cast `f` to double, do a double-precision add, and case the result back. 

f = f + 1.0f; // Single-precision addition. 

하는 것으로.

관련 문제