2012-12-06 3 views
3

OK 그래서 난이static_cast <int> (var)과 * (int *) & var 사이의 차이점은 무엇입니까?

int b; 
char x = 'a'; 

//Case 1  
b = static_cast<int>(x); 
std::cout<<"B is : "<<b<<std::endl; 

//Case 2 
b = *(int*)&x; 
std::cout<<"B is changed as :: "<< b <<std::endl; 

지금 나는 경우 2, x의 첫 번째 바이트는 그것이 어떤 쓰레기 제공 정수와 비트 패턴이 b에 복사이라고 생각하는 재 해석되는 것을 알고 일을 시도하고 경우 1에서 값을 char에서 int으로 변환합니다.

그렇다면이 둘 사이에는 어떤 차이점이 있습니까?

+11

하나는 정의되지 않은 동작이고 다른 하나는 동작하지 않습니다. – Mysticial

답변

12

첫 번째 값의 변환은 int b = x;int b = static_cast<int>(x);과 같습니다.

두 번째 경우는 실제로 x이 사는 곳에 int이있는 것으로 가장하여 그 다음에 int을 읽으려고합니다. 그건 완전히 정의되지 않은 행동입니다. (예를 들어, intchar보다 더 많은 공간을 차지할 수있는, 또는 주소의 char 삶을 어디 int 이제까지 살 수 없음을 수 있습니다.)

0
  1. static_cast를 런타임 검사를 제공하지 않는 특정 유형의 객체를 참조하는 경우에 사용됩니다.

  2. seconde 경우 실제로 (bhuang3로 식별) c-style cast

2

2 차의 경우는 C 스타일 캐스트입니다,하지만 될 것이라고 1. 케이스에 C 스타일의 상당 아니다 b = (int)x;. 그리고 case 2의 C++ equivalent는 b = *reinterpret_cast<int*>(&x);이 될 것입니다. 어느 쪽이든, x가 1 바이트를 차지하기 때문에 case 2는 정의되지 않은 동작입니다. 반면에 x의 주소에서 int 값의 데이터를 강제로 읽으면 세그먼테이션 오류가 발생합니다 일부 시스템)의 주소가 int의 합법적 주소가 아니면 다음 값을 읽습니다. 그 값은 무엇인지 알 수 없습니다. 따라서 당신이 관찰 한 것처럼 "쓰레기"를 읽습니다.

+0

@phonetagger ..... Case-2는 기계의 바이트 순서를 찾는 데 유용 할 수 있습니다 .... – Recker

+0

@noleptr - 예, 일종의. 하지만 다른 방법은 int 위치에서 바이트를 읽는 것입니다. 위에서 언급했듯이, 바이트 위치에서 int를 읽는 것은 int 경계에 정렬되어 있지 않으면 SEGV가 될 수 있습니다. – phonetagger

+0

@noleptr : 예; 적어도 정수와 같은 길이의 char 배열을 사용하는 경우에만 (그렇지 않으면 코드가 손상됩니다). 그러나 그 정보는 그다지 유용하지는 않습니다. 당신이 이것을 알아야하는 모든 문제 (바이트 순서)는 이미 더 나은 방법으로 해결되었습니다. –

관련 문제