2013-03-05 3 views
10

는 프리미티브 타입에 19 특정 전환이 확개 프리미티브 전환이라고Java long (64)을 float (32)로 변환하는 것이 왜 확대로 간주됩니까?

참조 기본 변환 넓히는Oracle Docs

에서 오라클 상태 같이 짧은 INT에

  1. 바이트 , long, float 또는 double
  2. int, long, float 또는 double에 short
  3. 문자 긴, float로, 긴, 플로트, 또는 더블
  4. INT를 INT 또는 두 번 뜨는 길거나 더블
  5. ? 플로트는 32 개 비트를 갖고, 롱 넓히는 것으로 간주하는 방법 (64)이있는 경우 플로트

배로? 이것이 좁혀 야한다고 생각하지 않아야합니까?

+0

나는 정밀도와 관련 있다고 생각한다. 나는 그것에 대해서만 생각할 수 있습니다. – kaysush

+0

당신은 "* 길고 32 비트가 있고 길이가 64 *"라면 ... 너의 마음을 위로한다. – Bohemian

+0

나는 당신의 질문을 이해하지 못했다 : 길게 32 비트와 길게는 어떻게 확대되는 것으로 간주됩니까? 이것이 좁혀 야한다고 생각하지 않아야합니까? 긴 데이터 유형은 java에서 64 비트 부호있는 2의 보수입니다. 다음 링크를 참조하십시오. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – Gourabp

답변

18

float 또는 double으로 표시 될 수있는 값 범위는 long으로 표시 될 수있는 범위보다 훨씬 큽니다. long에서 float으로 변환 할 때 유효 자릿수가 손실 될 수 있지만 범위가 넓기 때문에 여전히 "확장"작업입니다. Java Language Specification, §5.1.2에서

:

하는 int 또는 long 값의 확장 변환이 떠있는, 또는 두 배로 긴 값의 정밀도의 손실이 발생할 수 있습니다 - 즉, 결과는 일부가 손실 될 수 있습니다 값의 최하위 비트의 값. 이 경우 결과 부동 소수점 값은 IEEE 754 가장 가까운 값으로 반올림 모드 (§4.2.4)를 사용하여 올바르게 반올림 된 정수 값 버전이됩니다.

double은 가능한 모든 int 값을 나타낼 수 있습니다.

+2

@ Mrshll187 - 사실, 'float'은 32 비트이며, 그 중 8 비트가 지수입니다. 가수를 나타 내기 위해 사용할 수있는 비트는 24 비트뿐입니다. 나는 "내가 64 비트까지 될 수있다"는 것이 무엇을 의미하는지 모른다. 부동 소수점 숫자는 1.40129846432481707e-45에서 3.40282346638528860e + 38 (NaN 및 ± 무한대와 같은 몇 가지 특수 값은 물론) 범위의 숫자 중 일부를 나타낼 수 있습니다. 'long '은 -9,223,372,036854775808에서 + 9,223,372,036854775807 사이의 모든 숫자를 나타낼 수 있습니다. 각 유형 이름을 숫자 하위 집합의 이름으로 생각할 수 있습니다. 부분 집합은 겹치지 만 각 부분 집합에는 다른 요소가 없습니다. –

+0

감사합니다. Ted! 나는 비트의 관점에서 생각할 때 이것을 파악하는 데 매우 힘든 시간을 보내고있었습니다. –

2

floatdoublelong보다 큰 값을 나타낼 수 있기 때문에 확대로 간주됩니다. 정밀도는 떨어질 수 있지만 값을 표시하는 것은 가능할 것입니다 (적어도 대략).

2

float로 표현할 수있는 숫자가 long으로 표시 할 수있는 숫자보다 크기 때문에 확장되는 것으로 간주됩니다. float가 32 비트 정밀도를 사용한다고해서 표현할 수있는 숫자가 2^32로 제한된다는 것을 의미하지는 않습니다.

예를 들어 float은 보다 큽니다.