반응형
자료형은 데이터를 표현하는 방법이다

자료형은 데이터가 실수냐 정수냐

얼마나 큰 수를 저장할 것이냐 를 고려하여

프로그래머가 사용하려는 데이터에 맞는 자료형을 고르면 된다.

 

  • 컴파일러에 따라서 약간의 차이가 있다.
  • 크게 정수와 실수로 구분된다.
  • 크기에 따라서 구분된다.

 

 

 

일반적 자료형 선택

정수는 일반적으로 int가 사용됩니다.

실수는 일반적으로 double이 사용됩니다.

 

CPU가 연산하기 가장 적합한 데이터의 크기가 int형입니다.

정수형 변수에서 연산이 동반이 되면 int형으로 형 변환이 되어 연산이 됩니다.

 

double형이 float보다 더 정밀하게 표현이 가능하며

컴퓨터 환경 발전으로 부담스럽던 double형 연산이 덜 부담되게 되었습니다.

 

double형 변수의 출력(printf) 서식 문자 - %f

double형 변수의 입력(scanf) 서식 문자 - %lf

 

 

unsigned

정수 자료형의 이름 앞에 unsgined 를 붙여서 선언하면 0과 양의 정수만 표현이 가능합니다.

unsigned 키워드가 붙으면 최상위 비트(MBS)도 데이터의 크기를 표현하는데 사용이 됩니다.

따라서 음의 정수를 표현하는 데이터 범위를 양의 정수로 표현하여 양의 정수를 두 배로 표현 가능해집니다.

 

 

 

연산자 sizeof

연산자 sizeof는 피연산자의 데이터 크기를 확인할 수 있습니다.

피연산자로 변수, 상수가 와도 되고, 자료형을 직접 넣어서도 사용가능합니다.

 

sizeof는 컴파일 타임에 연산된다.

런타임은 그때 그때 즉시 연산하는것인데 이렇게 작동하는게 아니라

컴파일 타임에 연산한 것의 결과인 정보를 그대로 가져다만 쓰기에 빠르게 작동한다.

 

 

 

문자 표현방식 문자 자료형

문자를 표현하는 약속된 코드가 있습니다.

그것이 아스키코드(ASCII : American Standard Code for Information Interchange) 입니다. 

 

컴퓨터는 문자를 표현 및 저장하지 못합니다. 따라서 문자 표현을 목적으로 각 문자에 해당하는

고유한 숫자를 지정합니다. 인간이 입력하는 문자는 해당 문자의 숫자로 변환이 되어 컴퓨터가 인식하고

컴퓨터에 저장된 숫자는 문자로 변환되어 인간의 눈에 보여지게 됩니다.

 

이러한 이유로 문자형도 컴퓨터에서는 정수로 취급됩니다.

컴퓨터 입장에서 아스키코드인 문자 'A'나 숫자 65나 똑같이 취급합니다.

 

컴파일 시 각 문자는 해당 아스키 코드값으로 변환됩니다.

즉 컴퓨터에게 전달되는 정보는 숫자입니다.

 

 

char형 변수와 출력

%c : 문자를 출력하는 서식문자

 

문자를 char형 변수에 저장하는 이유

  • 모든 아스키 코드 문자는 1바이트로 표현가능
  • 덧셈, 뺄셈과 같은 연산을 하지 않는다. 단지 표현에만 사용
  • 1바이트 크기인 char형 변수가 문자 저장하기 최적의 장소
  • 다만, 문자는 int형 변수에도 저장이 가능하다.

 

 

리터럴 상수

숫자도 메모리 공간에 저장된다.

이렇게 저장되는 값은 이름이 존재하지 않으니 변경이 불가능한 상수이다.

따라서 이를 리터럴 상수라 한다.

 

 

리터럴 상수도 자료형이 결정되어야 메모리 공간에 저장될 수 있다.

  • 정수는 기본적으로 int형으로 표현
  • 실수는 기본적으로 double형으로 표현
  • 문자는 기본적으로 int형으로 표현

 

 

접미사를 이용한 다양한 상수 표현

접미사를 통해서 상수의 자료형을 변경가능

 

float num1 = 5.789; 처럼 접미사를 쓰지 않을경우 자동으로 자료형이 정해져서

데이터 손실에 대한 경고메시지가 발생합니다.

 

 

 

이름을 지니는 심볼릭(Symbolic) 상수 : const 
  • 심볼릭 상수는 초기화할때 한번만 할당 가능합니다.
  • 처음 값을 할당하면 쓰는게(변경) 안되고 읽기만 할 수 있다.
  • 상수의 이름은 모두 대문자로 표시
  • 둘 이상 단어를 연결해서 사용할 때는 언더바로 두 단어를 구분하는것이 관례

 

 

 

자료형 변환

형변환의 예시

대입 연산자의 좌항을 기준으로 형 변환이 발생!

 

자동 형 변환의 방식 정리

형 변환의 방식에 대한 유형별 정리

  • 정수 => 실수 : 오차가 발생하게 된다. 부동소수점은 근사값으로 처리가 되기에 오차발생
  • 실수 => 정수 : 소수점 이하의 값이 소멸
  • 큰 정수 => 작은 정수 : 작은 정수의 크기에 맞춰 상위 바이트 소멸

 

정수의 승격에 의한 자동 형 변환

 

 

 

피연산자의 자료형 불일치로 발생하는 자동 형 변환

두 연산자의 자료형은 일치해야 한다. 일치하지 않으면

일치하기 위해서 자동으로 형 변환이 발생

 

산술연산에서의 자동 형 변환 규칙

  • 큰 자료형 우선시
  • 실수형 우선시

=> 이는 데이터의 손실을 최소화 하기 위한 기준

 

 

 

명시적 형 변환 : 강제로 일으키는 형 변환

아래의 그림에서 num1 과 num2가 정수이기에 정수값으로 계산된 이후에

자동 형변환에 의해서 double형으로 변환하게 된다.

즉 0.00000이 나옴 그래서 계산이 되기전에 (type)을 붙여서 강제 형변환을 한다.

 

divResult = (double)num1 / num2;

위의 예시처럼 num1 이 double형으로 명시적 형 변환 그리고 num1 과 num2의 / 연산 과정에서의 산술적 자동 형 변환!

그 결과 실수형 나눗셈이 진행되어 divResult에는 0.75가 저장된다.

자동 형 변환이 발생하는 위치에 명시적 형 변환 표시를 해서 형 변환이 발생함을 알리는 것이 좋다!

 

이미지 출처 : 윤성우의 열혈 C 프로그래밍

 

반응형

 

반응형

'C' 카테고리의 다른 글

반복문에 대하여!  (0) 2023.05.09
printf함수와 scanf함수 정리하기!  (0) 2023.05.09
비트 연산자에 대하여!  (0) 2023.05.09
정수와 실수의 표현 방식에 대하여!  (0) 2023.05.09
명령 프롬프트 / CMD(Command Prompt)  (0) 2023.05.08
반응형
비트 연산자

아래의 표는 비트연산자의 종류와 그에 따른 기능입니다.

비트 연산은 기본적으로 피연산자 사이에 비트연산자를 넣어서 사용합니다.

비트에서의 계산이기에 0, 1로 표현된 후에 계산을 해야 편합니다.

 

 

 

비트단위 AND연산자 : &

AND연산자는 피연산자 사이에 &을 써서 사용할 수 있습니다.

비트단위로 표현한 후 두 피연산자의 비트가 둘 다 1일때 1을 반환해줍니다.

그 외는 0을 반환합니다.

 

 

 

비트단위 OR연산자 : |

OR연산자인 |는 입문자들이 자판에서 찾기 힘든 문자입니다.

자판에서 ₩(원)표시인 자판을 찾아서 Shift를 누르고 치면 OR연산자(|)가 나옵니다.

비트단위로 표현한 후 두 피연산자의 비트가 둘 중 하나라도 1인 경우 1을 반환해줍니다.

그 외에는 0을 반환합니다.

 

 

 

비트단위 XOR연산자 : ^

XOR연산자도 마찬가지로 두 연산자 사이에 ^를 써서 사용할 수 있습니다.

XOR연산자는 특이하기 비트단위로 표현한 후 두 피연산자의 비트가 값이

같을 경우 0,  다를 경우 1을 반환해줍니다.

 

이런 특이한 연산자는 왜 사용하냐는 의문이 들 수 있습니다. 저 또한 그랬구요

XOR연산자는 가장 기본적인 암호화에 사용되기도 합니다.

암호화할 문장인 평문을 키값과 XOR연산을 할 경우 암호문이 나오게 됩니다.

반대로 다시 암호문에 키값을 XOR연산을 할 경우 원래의 평문이 나오게 됩니다.

예를 들어 암호문을 이용한 채팅이라면 상대방은 키값을 알아야 채팅으로 온 암호문을

키값으로 XOR연산해야 읽을수 있게 되는 것입니다.

 

 

 

비트단위  비트반전 연산자 : ~ 

비트반전 연산자인 ~는 데이터 앞에 붙일시 모든비트의 숫자를 반전시킵니다.

1의 비트는 0으로 0의 비트는 1로 반전되는 것입니다. 이 비트반전 연산자를 이용하면

해당 데이터의 1의 보수값을 쉽게 구할 수 있습니다. 참고로 여기에 1을 더하면 2의 보수가 됩니다!

 

 

 

Shift연산자 : << 비트 왼쪽 이동 & Shift연산자 : >> 비트 오른쪽 이동

<< Shift 연산자는 모든 비트를 왼쪽으로 이동시키는 연산자입니다.

예를 들어 num << n; 이면 num정수의 비트를 n칸만큼 왼쪽으로 이동시키는 것입니다.

반대로 >>Shift 연산자는 n칸만큼 오른쪽으로 이동시키는 것입니다.

왼쪽으로 한칸씩 이동할때마다 정수의 값은 두 배씩 증가,

오른쪽으로 한칸씩 이동할때는 반으로 감소합니다.

비트가 범위 밖으로 밀리게 되면 버려집니다.

비트를 왼쪽으로 밀어서 최상위비트에 1이 채워지면 음수가 됩니다.

최상위비트가 1일때 우측으로 이동시 0이 아닌 1로 채워집니다.

 

이미지 출처 : 윤성우의 열혈 C 프로그래밍

 

반응형

 

반응형
반응형
데이터 표현 방식

컴퓨터가 데이터를 표현하는 방식은 대표적으로 2진수(Binary)이며,

우리가 평소에 사용하는 것은 10진수(Decimal)입니다.

 

데이터 표현방식이 다를뿐 결국 같은 데이터입니다!

 

2진수(Binary) : 두 개의 기호를 이용해서 값(데이터)를 표현하는 방식

10진수(Decimal) : 열 개의 기호를 이용해서 값(데이터)를 표현하는 방식

N진수 : N 개의 기호를 이용해서 값(데이터) 을 표현하는 방식

 

2진수와 호환되는 8진수 16진수 또한 많이 사용됩니다.

8진수와 16진수는 일반인들이 볼때 매우 생소한 방식입니다.

그런데도 이것을 쓰는 이유가 있습니다.

 

8진수와 16진수는 컴퓨터가 사용하는 2진수에 호환됩니다.

2의 10승을 표현하려면 10비트가 필요한데 너무 길기에

프로그래머가 메모리를 살펴볼때 가독성이 떨어집니다.

그래서 이와 호환되는 8진수나 16진수를 사용하기도 합니다.

16진수는 자주 나옵니다.

 

 

 

진수별 표현법
  • 2진수 : 2진수는 0,1로 표현됩니다. 컴퓨터는 2진수로 이루어진 숫자를 이해할 수 있습니다. 
  • 10진수 : 10진수는 0~9로 표현됩니다. 사람들이 이해하기 가장 쉽고 주로 사용하는 숫자표현법입니다.
  • 8진수 : 8진수는 0~7로 표현됩니다.
  • 16진수 : 16진수는 0~9, A~E 로 표현됩니다.

 

 

 

데이터 표현단위 바이트

컴퓨터 메모리의 주소 값은 1바이트당 하나의 주소가 할당됩니다.

컴퓨터에 있어 바이트는 의미있는 단위입니다.

 

 

 

8진수 & 16진수 데이터 표현방법

 

 

 

정수 표현방식

가장 왼쪽 비트는 MSB(Most Significant Bit) 부호라고 부르며 음수나 양수, 부호를 나타내는 비트입니다.

이를 제외한 나머지 비트는 데이터의 크기를 나타내는데 사용합니다.

 

최상위비트와 관련된 유명한 일화로. 문명게임에서 간디의 폭력성 버그가 있습니다.

byte크기의 데이터로 예시를 들어보겠습니다. byte의 데이터 크기의 범위는 0~255입니다.

만약 0에서 -1을 하면 어떻게 될까요? 바로 가장 큰 값인 255가 됩니다.

이것을 언더플로우라고 합니다. 간디의 호전성이 0에서 수치를 하락시키니 호전성이 MAX가

되어버리는 버그로 유명했습니다.

참고로 오버플로우는 이와 반대인 255에서 +1을 해서 0이 되는 현상을 뜻합니다!

 

 

 

음의 정수 표현방식

정수를 음수로 표현한다면 '부호비트인 최상위 비트에 1을 올리면 되는건 아닐까?'

라고 생각할 수 있지만, 이것은 정답이 아닙니다! 밑의 그림을 예시로 들어보겠습니다.

+5와 -5를 더하면 0이 될거 같지만 실제로는 0이 되지 않았습니다

'부호비트인 최상위 비트에 1을 올리면 되는건 아닐까?'라는 가정은 틀린것입니다.

그렇다면 정수를 음수로 표현하는 방식은 어떻게 하는 것일까요?

바로 2의 보수로 음의 정수가 표현이 가능합니다.

2의 보수란 음의 정수로 표현하는 수의 비트를 모두 반전시킵니다!

0비트를 1로 1비트를 0으로 말입니다.

이렇게 반전시킨 수에 1을 더하면 그것이 2의 보수입니다

2의 보수를 통한 음의 정수 구하는법

이렇게 2의보수를 취해서 구한 음의 정수와 양의 정수를 더하면 0이 나옵니다!

더할때 범위를 벗어나는 올림수는 버려집니다 이렇게 0이 나오게 되므로 2의보수를 통한

음의 정수 표현 방식이 옳다는게 증명됩니다!

 

참고로 2의 보수로 음의 정수로 표현한 것을 다시 2의 보수를 취하면

원래의 정수가 나오게 됩니다.

 

 

 

실수 표현 방식

0과 1사이의 실수는 무한합니다.

모든 세상의 메모리를 끌어다 써도 마자르다.

그래서 메모리를 위해 정확도를 다소 포기하게 됩니다.

 

최상위비트는 역시 부호 비트로 사용됩니다.

 

밑에 그림처럼 e에 의해서 소수점의 위치가 정해지고

m에 의해서 소수의 길이가 정해집니다.

 

 

 

실수 오차 확인

아래의 코드를 실행하면 이론상으로는 10이 딱 나와야 합니다 하지만

결과 값은 10.000002가 출력이 됩니다.

 

실수는 무한하기에 정확하게 표현이 불가능 합니다. 즉 실수 표현에 있어서의 오차 발생은

C언어의 특성이 아닌 컴퓨터의 기본적인 특성입니다.

 

이미지 출처 : 윤성우의 열혈 C 프로그래밍

 

반응형

 

반응형

'C' 카테고리의 다른 글

자료형에 대하여!  (0) 2023.05.09
비트 연산자에 대하여!  (0) 2023.05.09
명령 프롬프트 / CMD(Command Prompt)  (0) 2023.05.08
키보드 정수 입력에 대해서!  (0) 2023.05.08
연산자에 대해서!  (1) 2023.05.08
반응형
절대경로(Absolute Path)

절대경로는 파일이나 디렉토리의 전체 경로를 뜻합니다.

루트 디렉토리(C:\) 부터 시작해 목표 파일이나 디렉토리까지의 모든 계층을 포함

 

절대경로는 항상 동일한 위치를 가리키기에 어디에서든 사용가능

 

프로그래머는 절대 경로를 거의 쓰지 않습니다.

 

절대경로는 내 PC에서의 경로에서는 맞을 수 있지만, 타PC의 경로에서는 다를 수도 있기에

협업등의 작업에서 불리합니다.

 

윈도우채제에서는 상위폴더 하위폴더경로 사이에 \ 를 사용하여 구분한다.

윈도우에서 절대 경로는 보통 드라이브 문자로 시작합니다.

 

 

 

상대경로(Relative Path)

상대경로는 현재 작업 디렉토리를 기준으로 파일이나 디렉토리의 위치를 나타냅니다.

상대경로는 현재 작업 디렉토리에 따라 실제로 가리키는 위치가 달라질 수 있습니다.

 

윈도우에서 상대경로는 보통 "."(현재 디렉토리) 또는 ".."(상위 디렉토리)로 시작합니다.

 

상대경로는 절대경로 보다 짧으며 이동 가능한 코드를 작성할 때 유용합니다.

 

. \ : 현재 경로

..\ : 상위 폴더 경로

 

 


절대경로와 상대경로를 구분하고 사용하는 것은 파일 및 디렉토리 관리에 있어 중요한 기술입니다!

 

 

 

윈도우 콘솔 명령어

cd(Change Directory) : 폴더 경로 변경

dir(Directory) : 현재경로에 있는 파일, 하위폴더 목록을 보여준다.

copy : 파일을 복사한다

move : 파일을 이동한다

type : 텍스트 파일을 볼때 사용

cls(Clear Screen) : CMD 화면에 표시된 모든 것을 지운다

rd(Remove Directory) : 해당 경로 삭제

ren(Rename) : 파일 이름 변경

 

반응형

 

반응형

'C' 카테고리의 다른 글

비트 연산자에 대하여!  (0) 2023.05.09
정수와 실수의 표현 방식에 대하여!  (0) 2023.05.09
키보드 정수 입력에 대해서!  (0) 2023.05.08
연산자에 대해서!  (1) 2023.05.08
변수에 대해서!  (0) 2023.05.08
반응형
scanf함수의 호출

scanf 함수에서의 %d 는 10진수 정수의 입력을 의미합니다

아래의 그림과 같이 한번의 scanf 함수호출을 통해서 둘 이상의 데이터를 입력 받을 수 있습니다.

 

 

 

scanf 에러 : 보안상 문제

해결방법 1(권장): SDL검사 : 아니요(/sdl)로 변경

1. 소스코드에서 우클릭을 한다

2. 속성을 눌러서 C/C++ 하위 일반을 눌러서 SDL 검사란에서 아니요(/sdl)로 변경해준다

 

 

 

해결방법 2: #define _CRT_SECURE_NO_WARNINGS 전처리 지시자를 사용

1. 소스코드 우클릭 속성에서 C/C++ 하위 전처리기에서 전처리기 정의란을 클릭하여 편집을 누른다.

2. 상단 탭에 _CRT_SECURE_NO_WARNINGS를 입력한다

3. 코드 상단에 전처리 지시자 #define _CRT_SECURE_NO_WARNINGS 를 입력한다.

 

 

 

해결방법 3: 코드 상단에 전처리 지시자 #pragma warning(disable:4996)을 입력한다

 

 

 

해결방법 4(권장): scanf 대신 scanf_s함수를 사용

scanf_s 함수는 인자값으로 메모리의 크키를 함께 입력받습니다.메모리의 크기 인자를 전달하지 않으면 사용자의 입력이 버퍼에서 허용하는 크기 범위를 초과해서 에러를 발생할 수 있습니다. 즉 scanf의 취약점을 보완한 상위호환형 함수입니다.

 

이미지 출처 : 윤성우의 열혈 C 프로그래밍

 

반응형

 

반응형

'C' 카테고리의 다른 글

정수와 실수의 표현 방식에 대하여!  (0) 2023.05.09
명령 프롬프트 / CMD(Command Prompt)  (0) 2023.05.08
연산자에 대해서!  (1) 2023.05.08
변수에 대해서!  (0) 2023.05.08
C언어 구조 파악!  (0) 2023.05.08

+ Recent posts