[C++] C++에서 사용되는 개념 2탄

Patrick!·2022년 5월 3일
0
post-thumbnail

1. 문자

같은 데이터를 어떤 식으로 분석/해석 하느냐에 따라 많은 차이가 존재한다

즉, 저장된 데이터는 변하지 않지만 이를 어떻게 분석/해석하느냐에 따라서 차이가 분명하다는 것이다.

section .data
	msg db 'Hello, World', 0x00
    a db 0x11 

위와 같이 a에 0x11을 Byte 크기로 넣을 때 컴퓨터는 2진수 10진수 8진수 등으로 데이터를 저장하는데 우리는 바로 n진수에 따라 해당 값의 본질은 변하지 않으나 출력되는 값이 다르게 보여질 수 있다는 것이 중요한 포인트이다.

section .data
	msg db 'Hello World', 0x00
    a db 17

해석의 기준은 n진수라는 것이다
이렇게 방금과 다른 진수로 표기된 값를 a 에 넣는다 할지라도 본질은 변하지 않는다는 것이다.

section .data
	msg db 'Hello World', 0x00
    a db 0x11, 0x11, 0x11, 0x11

그럼 여기서 궁금증이 하나가 생긴다 ... 문자열(String)은 어떻게 메모리에 저장이 되는가 ?

문자열의 경우 '아스키 코드' 를 기반으로 하여 메모리에 저장이 된다.

그렇다면 msg에 들어간 값을 살펴보자.

msg = { 0x48,0x65,0x6c, ... , 0x0 }

이와 같은 형태로 들어가 있음을 확인할 수 있다.
이는 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' 이렇게 문자열이 C의 타입 중 하나인 Char 형태로 분리가 진행된다.
그 이후, 각각의 문자가 '아스키 코드'에 해당하는 값의 n진수로 표현되어 메모리에 저장이 된것이다.

여기서 유심히 보아야할 점은 바로 마지막의 '0x0' 이라는 값이다. 이 값의 경우 문자열의 맨 마지막이 존재해야하는 C만의 언어스타일 이라고 보면된다.
이는 나중에 C++를 다루면서 다시 한번 알아보도록 하겠다.

앞서 배운 문자열 (String) 을 이용하면 ?!

같은 데이터라도 이를 분석/해석하기에 따라 차이가 명확하다고 했다.
분명 Hello World 라는 문자열을 msg에 넣었을때
msg = { 0x48,0x65,0x6c, ... , 0x0 } 이렇게 들어가는 것을 확인 할 수 있었다.

여기서 응용을 해본다면

section .data
	msg db , 0x48,0x65,0x6c, ... , 0x0 

msg 안에서 표현된 16진수의 값을 'Hello, World' 대신해서 넣고

PRINT_STRING msg

msg를 출력하면 당연하게도 'Hello World'가 출력된다.

처음에 말한 것처럼 '같은 데이터라도 이를 분석/해석하기에 따라 차이가 명확하다' 라는 개념이 성립하게 된다.

분명 분간하기도 어려운 n진수로 된 데이터를 넣었다.
하지만 출력했을때 문자열의 값으로 출력된다는 것은 해석을 통해 n진수의 데이터가 의미가 있는 데이터로 탈 바꿈을 한것이라는 걸 알 수 있다.

2. 엔디안

리틀 엔디안 vs 빅 엔디안 ?!

section .data
	msg db, 0x12345678 

이렇게 메모리에 넣게 되면 해당 값은

msg = { 0x78, 0x56, 0x34, 0x12, 0x00 ... }

이렇게 들어간 것을 확인 할 수 있는데, 어째서 넣으려던 것과는 반대로 숫자가 들어간 걸까 ?

이는 컴퓨터가 데이터를 저장할 때 Little Endian / Big Endian 방법으로 저장을 하기때문이다.
우리가 흔히 사용하는 Intel, AMD 에서는 Little Endian으로 데이터를 저장한다.

별로 중요하게 생각하지 않을 수 있으나 이는 서버에 게임의 데이터를 전송하는 과정에서 매우 중요한 역할을 하게 된다.

만약 서버에서는 Big Endian 으로 데이터를 저장할 때, 게임에서 전송되는 값은 Little Endian으로 저장되었다고 하면 컴퓨터는 이를 전혀 다른 값으로 해석을 하게된다.
Little Endian => 역순으로 저장 / Big Endian => 순차대로 저장

그렇기에 서버와 통신을 하게 된다면 Endian은 하나의 방법으로 정하고 사용하는게 좋다

profile
C++와 Unreal Engine / C#과 Unity / Katalon Studio를 통한 자동화 테스트 등을 하루하루 공부한 기록

0개의 댓글