2012-07-03 7 views
1

sizeof(double)은 항상 sizeof(void*)보다 크거나 같다고 가정하는 것이 안전합니까?sizeof (double)> = sizeof (void *)를 사용하는 것이 안전합니까?

어떤 상황에서 이것을 넣으려면 다음과 같은 휴대용? 나는 그것을 테스트 한 몇 가지 시스템에

int x = 100; 
double tmp; 

union { 
    double dbl; 
    void* ptr; 
} conv; 

conv.ptr = (void*)&x; 
tmp = conv.dbl; 

conv.dbl = tmp; 
printf("%d\n", *((int*)conv.ptr)); 

It does work,하지만 난이 sizeof(void*) > sizeof(double) 경우 끔찍하게 잘못 가고 볼 수 있습니다.

+0

그것은 UB AFAIK입니다. – RedX

+4

아니요, 그렇게 생각하는 것은 안전하지 않습니다. 'void * '가 16 바이트가되지 않는 이유는 무엇입니까? 그 어떤 것도 금지하지 않습니다. –

+0

@RedX C11에서는 더 이상 UB가 아닙니다. 물론 그 전에였습니다. –

답변

1

크기는 아무 관계가 없습니다. 거기에 항상 약간의 비트가 저장되고 크기는 항상 void*을 저장할 수있을만큼 커야합니다. 잘못된 점은 거의 임의의 비트 패턴을 포인터로 해석한다는 것입니다. 충돌보다 훨씬 많은 것을 할 수는 없지만, 이미 알고있을 것입니다. 하지 마.

+2

그가 'double'을 사용하는 이유는 비트를 주변으로 이동시키는 것입니다. 실제 데이터는'int *'로 시작하고 결국'int *'로 해석됩니다. 그러나 그는 'double'을 통해 그것을 전달하는 것이 포인터의 비트 중 일부를 잃을 까봐 두려워합니다. 'sizeof (double)> = sizeof (void *)'인 경우, 손실이 발생하지 않아야합니다. – ugoren

+0

더블을로드/저장하는 것만으로 비트 패턴이 변경 될 수 있습니다. –

+0

@HotLicks : 우리가 IEEE 산술에 대해 이야기한다면, 나는 그것이 일어날 수 있다고 생각하지 않습니다. 모든 이중 표현은 유효합니다 (정상 또는 비정규 숫자, 무한대 또는 NAN). 각각의 non-NAN은 고유 한 표현을 가지고 있으므로 (예 : 로딩과 저장은 표현을 변경할 수 없거나 값을 변경합니다), NAN은 (가능한 한 산술과 초월 함수에서도) IEEE별로 의도적으로 보존되어 있습니다. 프로그래머가 적합하다고 보는 추가 정보를 전달하십시오. –

3

현재 시스템 있음. double은 모두 의 64 비트이며 현재는 모두 시스템입니다. IEEE 산술의 배정 밀도로 정렬되어 있기 때문입니다. 포인터가 앞으로 더 커질 가능성은 희박하지만 가능할 수도 있습니다. 아마도 더 큰 주소 공간을 위해서가 아니라, 경계 정보를 가지고 운반하기 위해서 일 것입니다. 하나 조합원에 작성하고 서로 읽기 때문에이 doublevoid * 사이의 관계에 의존하는 정말 나쁜 생각처럼 보인다 어떤 경우

...