2012-04-30 4 views
0

아는대로 C 프로그래밍 언어에서 배열은 요소별로 메모리 요소에 저장됩니다. (즉, 요소 ​​0, 요소 1, 요소 2, ..., 요소 n). 나는 다음과 같은 코드로 그를 참조하기 위해 노력하고있어 : 서명되지 않은 문자는 1 바이트이고, 정수는 4 바이트부호없는 문자 배열을 정수로 변환

unsigned char a[] = { '\1' , '\2', '\3' ,'\4' }; 
printf("%d\n", (int*) a); 

때문에; I는 값 인쇄하는 생각 그러나

00000001 00000010 00000011 00000100 = 2^2 + 2^8 + 2^9 + 2^17 + 2^24 = 16,909,060

을 때 이 프로그램을 실행하면 모든 시도마다 다른 결과가 생성됩니다.

무엇이 여기에 있습니까?

+0

대부분의 컴퓨터에서 바이트 순서는 사용자가 가정 한 것과 반대입니다. –

+0

관련 : http://stackoverflow.com/q/29969049/694576 – alk

답변

4

아마도 *(int *)a을 사용하고 싶지 않을 것입니다. 그렇지 않으면 방금 주소를 인쇄하고있는 것입니다.

  • 당신은 당신의 플랫폼의 endianness에 따라 다른 결과를 얻을 것이다 :

    그러나,이 구현 정의 동작을 호출합니다.

  • 플랫폼에 따라 char 배열이 int으로 올바르게 정렬되지 않을 수 있습니다.
  • 컴파일러는 int *을 통해 char 배열을 읽을 수 없다는 가정하에 펑키 최적화를 수행 할 수 있습니다. 즉, 엄격한 앨리어싱 규칙을 위반합니다.
+0

또한 인쇄 내용은이 상자의 엔디안 유형에 따라 다릅니다. –

+1

Re "엔디안에 따라 두 가지 결과 중 하나를 얻습니다." 두 명만이 아닙니다. 아직도 주변 엔디안 상자가 혼합되어 있습니다. 예 : 0x2143 또는 0x3412. –

+0

@David : 공정한 점; 그에 따라 적응 된 문구! –

관련 문제