코딩 공부/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;
    }
    반응형

    '코딩 공부 > 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