IT&코딩 공부/C, C++

2. 자료형

갬성꿈돌이 2024. 1. 17. 00:46
반응형
반응형

 

 


비트와 바이트

//Bit = 0, 1만 들어가는 최소의 단위
//Byte = 8개의 Bit로 구성된 것

 

 

https://semiconductor.samsung.com/kr/support/tools-resources/dictionary/bits-and-bytes-units-of-data/

 

바이트(Byte) | Samsung Semiconductor KR

삼성반도체 공식 웹사이트 기술 블로그에서 바이트(Byte)에 대해 알아보세요.

semiconductor.samsung.com

 

 

 

 

 

자료형

자료형 Data type(크기 단위, Byte) : 자체만으로는 아무 의미가 없고 앞으로 선언할 코드에 대한 형태만 지정. 컴퓨터는 선언된 자료형만큼의 메모리를 확보하여 프로그래머에게 제공한다.

 

  • 정수형 : char(1)(문자형으로도 쓰임), short(2), int(4), long(4), longlong(8)
  • 실수형 : float(4), double(8)


ex)

 

int i = 0;
int : 자료형(자료형마다 정해진 역할이 있고 그 자료형을 맞춰 넣어야함)으로 -2,147,483,648 ~ 2,147,483,647 까지 표현.
i : 변수명(내 맘대로 이름 지어주는 것으로 변경 가능)

 

// 예시 1 :  i = 2147483648; 출력결과 : -2147483648
// 예시 2:  i = -2147483649; 출력결과 : 2147483647

// 예시 3 :  i = 2147483700; 출력결과 : -2147483596
// 예시 4 :  i = -2147483700;출력결과 : 2147483596

 

// 위의 예시들은 표현 가능한 한계치를 넘어가 bit 자리밀림으로 인해 보수되어 음양 및 숫자의 표현이 달라짐. 이 부분은 아래 보수법에서 조금 더 자세히 다룰 예정



오늘날은 4 bytes (32bits)를 기본으로 하기 때문에 2 bytes (16 bits) 컴퓨터가 유행하던 시절 사용하던 용어들인 short, long, float들은 주로 int, double, char로 단순화하여 사용된다.

 

 

sizeof() 함수 속에 자료형을 넣어 배정된 메모리의 크기를 확인할 수 있다.

// 예제) sizeof() 함수로 배정된 메모리의 크기조사

#include <stdio.h>

void main() {
printf("char=%d\n", sizeof(char));
printf("unsigned char=%d\n", sizeof(unsigned char));
printf("int=%d\n", sizeof(int));
printf("unsigned int=%d\n", sizeof(unsigned int));
printf("float=%d\n", sizeof(float));
printf("double=%d\n\n", sizeof(double));
printf("short=%d\n", sizeof(short));
printf("unsigned short=%d\n", sizeof(unsigned short));
printf("long=%d\n", sizeof(long));
printf("unsigned long=%d\n", sizeof(unsigned long));
}

#include <iostream.h>
void main() {
cout<<"char="<<sizeof(char)<<'\n';
cout<<"unsigned char="<<sizeof(unsigned char)<<'\n';
cout<<"int="<<sizeof(int)<<'\n';
cout<<"unsigned int="<<sizeof(unsigned int)<<'\n';
cout<<"float="<<sizeof(float)<<'\n';
cout<<"double="<<sizeof(double)<<"\n\n";
cout<<"short= "<<sizeof(short)<<'\n';
cout<<"unsigned short="<<sizeof(unsigned short)<<'\n';
cout<<"long="<<sizeof(long)<<'\n';
cout<<"unsigned long="<<sizeof(unsigned long)<<'\n';
}

 

 

 

 

 

 

Singed와 Unsigned, 양수와 음수 표현


unsigned char c1 = 0;
unsigned : 양의 정수만 표현하여 c1 = 0~255 까지 표현.
c1=256 넣으면 bit를 그려봤을 때 맨 앞자리가 1이 되어 밀려나고 뒷자리는 모두 0이 되기 때문에 c의 출력결과는 0이 됨.
c1 = 257; 출력결과 : 1


signed char c2 = 0;
signed : 양음표현. 생략가능하기 때문에 unsigned를 안쓰면 기본적으로 signed로 계산되며 c2 = -128~127 까지 표현.
c2 = 128; 출력결과 : -128
c2 = 130; 출력결과 : -126
c2 = -129;출력결과 : 127
c2 = -130;출력결과 : 126

 

// 표현 가능한 한계치를 넘어가는 순간 bit 자리밀림으로 인해 보수되어 음양 및 숫자의 표현이 달라짐. 이 부분은 아래 보수법에서 조금 더 자세히 다룰 예정

 

 

 

 

MSB와 2의 보수법

 

c1, c2와 같이 한계치를 넘기고 음, 양을 바꿔가며 출력했을 때 값이 생각보다 뒤죽박죽으로 나오는데 컴퓨터의 연산은 2진수 + bit 자리값이기 때문에 컴퓨터가 읽을 수 있는 수로 변환되어 해석한다. 즉, 사용자가 컴퓨터에 1을 입력해도 1로써 받아들이는 게 아닌, 1이라는 숫자가 Bit로 변환되어 컴퓨터에게 입력된다. 그리고 컴퓨터는 그 Bit인 ('0','0','0','0','0','0','0','1')를 해석한다. 그렇기 때문에 사용자가 특정 값을 입력해도 컴퓨터는 다른 값으로 해석할 수 있다.

 

 

MSB(most significant bit) : 가장 앞에 있는 비트값을 최상위비트라고 하며 그 값이 0인지 1인지에 따라 양/음수 부호가 결정됨. 양수는 MSB가 0, 음수는 MSB가 1.

  • 양수 예제 : ('0','0','0','0','0','0','0','1') = 1의 비트
  • 음수 예제 : ('1','1','1','1','1','1','1','1') = -1의 비트

 

음수 비트는 <보수법> 사용으로 구한다. 보수법이란, 대응되는 양수의 비트들을 반전 후, 1을 더한다.

  • 예제 : -2의 비트를 구하시오.

    STEP 1 : 2의 비트. ('0','0','0','0','0','0','1','0')
    STEP 2 : 2의 비트 반전. ('1','1','1','1','1','1','0','1')
    STEP 3 : 1 더하기. ('1','1','1','1','1','1','0','1') + ('0','0','0','0','0','0','0','1') = ('1','1','1','1','1','1','1','0')
    결론적으로, 둘이 더했을 때 0이 되는 비트가 그 수에 대응되는 음수 비트.

https://tcpschool.com/c/c_refer_negativeNumber

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

 

 

형변환, 정수와 실수의 연산

 

int a = 10.2415 + 20;
printf("a는 %d\n", a);

// 결과 : 30

// 자료형으로 계산시 우리에게는 안보이지만 int형에 맞춰 4.0이 4로 변환되는 형변환 연산이 실행됨.


float f = 10.2415f + (float)20;
printf("f는 %f\n", f);

// 결과 : 30.2415
// 컴퓨터는 실수에서의 계산을 특정 숫자를 정확하게 표현하는게 아닌, "근삿값"으로 표현하기 때문에 정밀도에 의존함.
// 따라서 올바른 계산식을 써도 소수를 정확하게 계산하지 못해 값이 달라지거나 버그가 발생할 수 있음.


// 정수와 실수는 Bit와 데이터를 처리하는 방식 자체가 완전 다르니 연산 시에 정확하게 선택하기.
// double(8Byte) 자료형이 float(4Byte) 보다 더 아래의 소수점까지 정확하게 표현이 가능하니 최대한 double형 쓰자.
// 정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 연산될 경우 꼭!!! 명시적으로 변환하자.

 

 

 

 

정수형과 실수형 혼합 연산 실행 화면

 

 

 

 

강의 정리

#include<stdio.h>

int main() {
	
	//자료형 Data type(크기 단위, Byte) : 자체만으로는 아무 의미가 없고 앞으로 선언할 코드에 대한 형태만 지정.
		//정수형 : char(1), short(2), int(4), long(4), longlong(8)
		//실수형 : float(4), double(8)

	//Bit = 0, 1만 들어가는 최소의 단위
	//Byte = 8개의 Bit로 구성된 것


	int i = 0;
	//int : 자료형(자료형마다 정해진 역할이 있고 그 자료형을 맞춰 넣어야함)
	//int = -2,147,483,648 ~ 2,147,483,647 까지 표현
	//i : 변수명(내 맘대로 이름 지어주는 것으로 변경 가능)

		// i = 2147483648; 출력결과 : -2147483648
		// i = -2147483649; 출력결과 : 2147483647

		// i = 2147483700; 출력결과 : -2147483596
		// i = -2147483700;출력결과 : 21474835960
		
		// 부호만 거꾸로 한다고 부호만 반대된 같은 숫자가 나오는 게 아니다.
		// 컴퓨터의 연산은 2진수 + bit 자리값이기 때문에 다르다.

	
	
	unsigned char c1 = 0;
	//unsigned : 양의 정수만 표현
	// c1 = 0~255 까지 표현
		// c1=256 넣으면 bit를 그려봤을 때
		// 맨 앞자리가 1이 되어 밀려나고 뒷자리는 모두 0이 되기 때문에
		// c의 출력결과는 0이 됨.
		// c1 = 257; 출력결과 : 1
	

	signed char c2 = 0;
	//signed : 양음표현. 생략가능하기 때문에 unsigned를 안쓰면 기본적으로 signed로 계산됨.
	// c2 = -128~127 까지 표현
		// c2 = 128; 출력결과 : -128
		// c2 = 130; 출력결과 : -126
		// c2 = -129;출력결과 : 127
		// c2 = -130;출력결과 : 126
		
	
	// 표현 가능한 한계치를 넘어가는 순간 bit 자리밀림으로 인해 음양 및 숫자의 표현이 달라짐.
	// 2의 보수법 내용 확인 필요.
	// MSB 내용 확인 필요.




	int a = 10.2415 + 20;

	printf("a는 %d\n", a);
	// 자료형으로 계산시 우리에게는 안보이지만 int형에 맞춰 4.0이 4로 변환되는 형변환 연산이 실행됨.
	
	float f = 10.2415f + (float)20;
	printf("f는 %f\n", f);
	// 컴퓨터는 실수에서의 계산을 특정 숫자를 정확하게 표현하는게 아닌, "근삿값"으로 표현하기 때문에 정밀도에 의존함.
	// 따라서 올바른 계산식을 써도 소수를 정확하게 계산하지 못해 값이 달라지거나 버그가 발생할 수 있음.


	// 정수와 실수는 Bit와 데이터를 처리하는 방식 자체가 완전 다르니 연산 시에 정확하게 선택하기.
	// double(8Byte) 자료형이 float(4Byte) 보다 더 아래의 소수점까지 정확하게 표현이 가능하니 최대한 double형 쓰자.
	// 정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 연산될 경우 꼭!!! 명시적으로 변환하자.

	return 0;
}

 

 

반응형

'IT&코딩 공부 > C, C++' 카테고리의 다른 글

6. 함수와 변수  (1) 2024.01.23
5. define과 비트연산자  (0) 2024.01.19
4. 조건문  (0) 2024.01.17
3. 연산자  (0) 2024.01.17
1. C언어 기초  (0) 2024.01.16