, 방금 예를 들어, 직접 배에 비트를 저장할 수 있다고 생각하는 것 :
int32_t i1 = rand();
int32_t i2 = rand();
int64_t x = (((int64_t)i1)<<32) | ((int64_t)i2);
double theDouble;
memcpy(&theDouble, &x, sizeof(theDouble));
을 ... 그렇게하는 것은 "거의 효과가 있습니다". 즉, i1 및 i2의 가능한 많은 값에 대해서는 정상적으로 작동하지만 모두에 대해서는 그렇지 않습니다.특히 IEEE754 부동 소수점 형식의 경우 지수 비트가 0x7ff로 설정된 모든 값은 "NaN"을 나타내는 것으로 처리되며 부동 소수점 하드웨어는 다른 NaN 상당 비트 패턴을 해당 기본 설정으로 다시 변환 할 수 있습니다. 인수로 double을 전달할 때 NaN 비트 패턴.
두 개의 32 비트 정수를 두 개로 채우는 것은 대부분의 경우 작동하는 것처럼 보일 수 있지만 가능한 모든 입력 값으로 테스트하면 값이 예기치 않게 두 번 내부에 머물렀을 때 돌연변이가 발생하여 다시 해독 할 때 다른 값으로 나온 경우도 있습니다.
물론이 경우에는 double의 가수 비트를 설정하는 데주의해야하지만이 경우 정수 당 26 비트 만 제공하므로 +/- 정수 값만 저장할 수 있습니다. 33,554,432 정도입니다. 유스 케이스에 따라 괜찮을 수도 있습니다.
제 조언은 당신이하려는 일을하는 다른 방법을 찾아야한다는 것입니다. 부동 소수점 변수에 부동 소수점 데이터를 저장하는 것은 문제를 요구하고 있습니다. 특히 코드를 이식성있게 만들려면 더욱 그렇습니다.
왜 그렇게할까요? –
이것으로 무엇을 이루고자합니다. 질문에'encoding'이라는 태그가 붙어 있기 때문에, 어느 시점에서 두 개의 int를 되찾기 위해 double을 해독하려고한다고 가정합니다. 이 경우 엔코딩을 잃어 버리지 않으시겠습니까? – Vikas
@Paolo 1. 흥미로운 질문입니다. 2. 왜냐하면 나는 double을 취하고 2 개의 ints를 전달해야하는 팩토리 메소드를 가진 추상화 된 타입을 가지고 있기 때문이다. –