본문 바로가기

교육/*

CPU메모리의 저장방식

Intel ( 계산을 자주하는 CPU )

little endian(리틀 엔디안)방식

->산술에는 유리하지만 숫자의 대소비교에는 불리하다.


12 

34 

56 

78 

의 메모리를 저장하면


이렇게 뒤집어서 저장을 하게된다.

78 

56 

34 

12 



-> printf로 출력했을때에 다시

12 

34 

56 

78 

로 뒤집혀서 출력된다.





Super ( 논리연산을 자주하는 CPU (ex:참or거짓) )

Big endian(빅 엔디안)방식

->대소비교에는 유리하지만 산술에는 불리하다.


12 

34 

56 

78 

의 메모리를 저장하면 그냥 그대로 저장된다.




*상대적으로 유리하며 불리하다는 것임. CPU의 계산 속도는 매우 빠르다! (불리하던 유리하던.)




위 사진을 보면 분명히 12번째 줄에 *p로 첫번째의 메모리를 AA로 바꾸었다.

(생각해보면 [12][34][56][78] 의 첫번째 [12]->[AA])

하지만 출력된 값은 [12][34][56][AA]이다. 

이 이유가 little endian방식을 사용하기 때문이다.

[78][56][34][12] 에서의 첫번째 메모리 [78]->[AA]으로 바꾸었다고 컴퓨터는 생각하기 때문에.


이 소스의 /*코드를 보면 15번째줄에 *p를 출력하라고 명령하였는데, 출력된값은 ffffffaa이다.

이 이유는 16진수의 AA 즉 1010 1010을 컴파일러가 음수로 받아들여 1010 1010의 앞을 전부 1로 채우기 때문이다.

1111 1111 1111 1111 1111 1111 1010 1010인 것!! 그렇기 때문에 값을 출력할때 16진수의 값 ffffffaa가 나오게 되는 것이당 ^^!~!!*/


char *  p=(char*)&iNum;  AA(1010 1010)=10진수 170(-40) 
가 음수정수로 저장 되기 때문에 FFFFFFAA  가 저장됨

/* char 형 값의 표현 범위 -128 ~ +127 */

/* char 형 값의 표현 범위 -128 ~ +127 */


음수로 출력되는 것을 막기위해! unsigned char를 입력해주었다!

그러자 출력값이 aa가 뜨는것을 확인할 수 있다!






... 

 ...

 AA

 56

34 

12 

... 

... 

  P            P + 1         P + 2          P + 3


15번째 줄 *(p+1)은  p의 +1메모리를 읽으라는 뜻

*p=0xAA; 는 AA를 p에 넣으라는뜻!!

두개의 뜻은 다르다!!


'교육 > *' 카테고리의 다른 글

비공개 DOS올리기^^  (0) 2014.03.20
DOS로 선생님 폴더에 내 파일 업로드하기  (0) 2014.03.20
소수...;;;  (0) 2014.03.19
출력!  (0) 2014.03.18
ㅠㅠ형식  (0) 2014.03.18