언어/C++

잡지식 / 잡기술

chrtfro98 2023. 9. 13. 03:50

 

 

부동소수점 (float)

더보기

임의의 숫자를 정규화 한다는 것은 0.31415926535 * 10 와 같이

숫자를 0.**** 와 10진수의 곱으로 표현하는 것이다.
여기에서 3141592는 유효숫자, 지수는 1 이라고 표현한다.

 

컴퓨터에서 실수형을 저장할 때
float      : 부호1 지수8 유효숫자 23 = 32비트 = 4바이트
double  : 부호1 지수11 유효숫자 52 = 64비트 = 8바이트

형태로 바이트를 나누어 저장한다.

 

 

ex) -3.375라는 값을 저장한다

 

(1) 2진수 변환
-> 3 + 0.375 = 0b11 + 0b0.011 = 0b11.011         

// 소수점 뒤의 수를 변환하는 방법

//1비트가 커질 때 마다 2배씩 커졌던 것에서, 반대로 1에서 1비트씩 작아질 때 마다 2로 나눠서 수를 저장한다.
0.375 = 0.5*0 + 0.25 * 1 + 0.125 * 1 = 0b0.011

 

(2) 정규화
-> 0b1.1011 * 2^1
// 부호는 1, 지수 1, 유효숫자 1011
단, 지수는 unsigned byte로 가정하고 숫자 + 127로 만들어준다.
그 결과로 컴퓨터에 byte로 저장되는 방식은
0b 1 1000'0000 1011'000'0000'0000'0000'0000 로 4바이트를 저장한다.

 


부동소수점은 항상 근사값이다.
수가 커질수록 오차범위도 매우 커질 수 밖에 없다.
따라서 실수 2개를 == 으로 비교하는것을 지양해야 한다.

 


추가로 float 형식의 데이터 타입을 사용하고싶으면 숫자뒤에 f를 붙여야 float로 기능한다.

 

 

 

 

 

문자 및 유니코드

 

더보기

char 타입은 알파벳, 숫자, 문자를 표현하기 위한 타입이다.

예로 char타입의 1은 정수지만 문자 의미를 나타내기 위해 사용한다.

 

wchar_t 타입은 유니코드 문자를 사용하기 위한 타입이다.

 

아스키코드
ascii   american standard code for informoation interchange

char ch = 97; 을 출력하면 a가 출력된다. 아스키 코드에 대응되는 문자를 출력하는 것이다.

char ch = 'a'; 와 같다.

문자의 의미로 작은따옴표 ' '를 사용한다.

작은 따옴표를 사용함으로서 아스키 코드 표를 볼것 없이 'a'로 a를 출력할 수 있다.
이와 같은 흐름에서 '1'의 의미는 1이라는 숫자가 아니라, 1의 아스키코드에 대응하는 숫자가 들어간다.
그래서 'a' + 1 의 출력도 가능하며 결과는 b가 나온다.

 

 

유니코드

전 세계 모든 문자에 대해 아스카코드처럼 유일 문자를 부여한 것이 유니코드이다.

유니코드의 표기방식은 여러가지가 있는데 그 중 대표적으로 UTF8 UTF16가 있다.

 

UTF8

알파벳, 숫자를 표현 시 문자 당 1바이트의 공간을 갖는다.
유럽지역의 문자는 2바이트가 할당되며
한글, 한자 등은 3바이트이다.

 

UTF16
거의 대부분의 문자들이 동일하게 2바이트를 갖는다.

 

 


char는 1바이트만 저장하는데
유니코드는 바이트가 왔다갔다 함
그 여러가지 유니코드 중 UTF16을 저장하기 위한 자료형이 wchar_t 이다.

 

이 자료형을 사용할 때는

wchar_t wch = L'문자';

같이 문자 앞에 L을 붙여줘야 하는데 wchar_t 타입으로 캐스팅해준다는 의미이다.

 

main에서 cout을 사용하여 wchar를 출력하려 했지만 이상한 값이 나온다.
cout은 char전용이라서 wcout을 해줘야 정상적으로 출력된다. 또한 기본적으로 한국어를 인식하지 못하기 때문에 wcout.imbue(locale("kor"));
이란 코드줄을 추가해줘야 한다.


즉 문자 자체는 숫자에 불과한데 어떤 방식으로 표현해 줄지 선택(유니코드, 아스키)

 

 

 

 

 

문자열

 

더보기

문자열(문자들의 배열)의 끝은 null(아스키코드 0번 = \0)이 들어가있다.
정수처럼 1~8바이트 고정길이가 아닌 가변길이 이므로 그 끝에 null을 붙여주는 것

 

char str1[] = {'h','e','l','l','o','\0'};
char str2[] = "hello"; 차이
큰 따옴표로 문자를 표기하면 자동으로 뒤에 null(\0)이 포함된다. -> str2의 길이는 6이다.

 

 

 

 

 

c++ 코드 잡기술

 

더보기

드래그 한 부분 전체를 주석처리

ctrl + k + c (comment) / ctrl + k + u (uncomment)


코드에 영향은 안가지만 문장을 접었다 폈다 할 수있다.
#pragma region
#pragma endregion

 

 

 

 

비트연산

 

더보기

비트연산 중 시프트 연산을 할 때
<<연산은 왼쪽의 넘치는 비트는 버리고 새로 생성되는 비트는 0으로 채워짐
*2를 할 때 자주 보이는 패턴 (직접 곱하는 것 보다 속도가(연산이) 빠르다.)

하지만 >>연산은
오른쪽의 넘치는 비트는 버리고 왼쪽에 새로 생성되는 비트의 경우 주의해야함
부호비트가 존재할 경우 연산 후 다시 부호비트를 켜두고 
부호비트가 없다면 그냥 연산하면 된다.
따라서 비트연산을 할 때에는 숫자를 unsigned 타입으로 만들어주는게 좋다.

 

 

 

 

 

메모리

 

더보기

빌드하여 exe실행파일을 만들고
exe파일을 실행 시 메모리에 데이터들이 올라가는데
메모리는 올라간 데이터들을 여러 부분에 할당한다.
그 중 데이터 영역과 힙, 스택 영역이 있다.

데이터영역
.data (초기값 있는 경우)
int a = 1;
.bss (초기값 없는 경우)
int b;
.rodata (읽기 전용 데이터 // read only data)
const char* msg = "Hello World";

 


int main(){
스택영역
int c = 1;
}