컴퓨터를 공부하고자 마음먹은지 N일차

[5일차](홍정모의따배c)정수와 실수2 본문

🖥C

[5일차](홍정모의따배c)정수와 실수2

졸린새 2020. 9. 13. 02:47
728x90

[5일차](홍정모의따배c)정수와 실수2

*본 강의수기는 교수님의 모든 ppt나 코드 화면을 붙인게 아닙니다. 따로 출처 표시나 과제표시

안한 모든 코드와 사진자료의 출처는 본 강의의 교수님 입니다.

정리는 다시한번 제가 보기위함과 어떤강의인지 알려드리는 것이고

제가 적은건 이해를 돕기 위한 부연설명과 제가 이해한 몇개의 중심적인 내용이 다소

생략이 되었습니다. 이 수기를 통해 공부하려 하지말고 흥미로운 내용이라면

'인프런- 홍정모의 따라하며 배우는c' 과정을 수강하시길 바랍니다.

정수의 오버플로우

#include <stdio.h>

int main()
{
    unsigned int i = 0;
    
    printf("%u\n", sizeof(unsigned int));//출력하는데이터가 언싸인드면 %u를 쓰는게 관례다
    printf("%u", sizeof(i));
}

#include <stdio.h>
#include <limits.h>  // UINT_MAX를 끄집어내온 출처인거같다

int main()
{
    unsigned int i = 0b11111111111111111111111111111111;  //32비트 최대값 
    //2의 32승을 구해라
    unsigned int u = UINT_MAX;     //UINT_MAX unsigned int 의 최대값
        
    printf("%u\n", i); //unsigned 수는 무조건 %u
    printf("%u\n", u);
    
    return 0;
}

#include <stdio.h>
#include <limits.h>

int main()
{
    unsigned int u_max = UINT_MAX;
    unsigned int u_min = 0;    //unsigned int는 최소값이 정해져 있지 않다
    signed int i_max = INT_MAX;  //signed int 의 최대값
    signed int i_min = INT_MIN;
        
    printf("max of uint = %u\n", u_max);
    printf("min of uint = %u\n", u_min);
    printf("max of int = %d\n", i_max);
    printf("min of int = %d\n", i_min);
    
    return 0;
}

#include <stdio.h>
#include <limits.h>

int main()
{
    unsigned int u_max = UINT_MAX + 1; //오버플로우 발생시키기
    
    printf("%u", u_max);
    
    return 0;
}

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main()
{
    unsigned int u_max = UINT_MAX;
    
    char buffer[33];
    _itoa(u_max, buffer, 2); // 변수가 담고있는 숫자를 2진수로 바꿔준다.
    
    printf("decimal: %u\n", u_max);
    printf("binary: %s\n", buffer);
    
    return 0;
}

이렇게 컴파일하면

xcode에선 무슨일인지 컴파일 안된다

다른 c환경이라 그렇다고 한다.

원래는 컴파일 하면

데시멀에 10진수로 2의 32승

바이너리에 11111111111111111111111111111111

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main()
{
    unsigned int u_max = UINT_MAX + 1; //더하기1했다
    
    char buffer[33];
    _itoa(u_max, buffer, 2); 
    
    printf("decimal: %u\n", u_max);
    printf("binary: %s\n", buffer);
    
    return 0;
}

이러면 오버플로우 돼서 0이라고 뜬다

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main()
{
    unsigned int u_max = 0 - 1; //가장 작은 값보다 하나를 뺐다.
    
    char buffer[33];
    _itoa(u_max, buffer, 2); // 변수가 담고있는 숫자를 2진수로 바꿔준다.
    
    printf("decimal: %u\n", u_max);
    printf("binary: %s\n", buffer);
    
    return 0;
}

그러더니 둘다 최댓값이 나왔다

8진수와 16진수
#include <stdio.h>

int main()
{
    unsigned int decimal = 4294967295;
    unsigned int binary = 0b11111111111111111111111111111111;
    unsigned int oct = 037777777777;
    unsigned int hex = 0xffffffff;
    
    printf("%u\n", decimal);
    printf("%u\n", binary);
    printf("%u\n", oct);
    printf("%u\n", hex);
    
    printf("%o %x %#o %#x %#X", decimal, decimal, decimal, decimal, decimal);
    
    return 0;
}

출력하고 싶은 결과에 따라 %o %x %#o %#x %#X 등 다르게 나타낼 수 있다

문자형

#include <stdio.h>

int main()
{
    char c = 'A'; //c에 A라는 문자값을 넣는다.
    char d = 65;  //d에 아스키코드 65를 넣는다.
    
    printf("%c %hhd\n", c, c); //c를 문자형으로 출력,c를 정수형으로 출력
    printf("%c %hhd\n", d, d);
    //d를 문자형으로 출력, d를 정수형으로 출력
    
    return 0;
}

#include <stdio.h>

int main()
{
    char c = 'A'; //c에 A라는 문자값을 넣는다.
    char d = 65;  //d에 아스키코드 65를 넣는다.
    
    printf("%c \n", c + 1); //c에 1을 더한만큼에 해당하는 아스키코드를 출력한다
    
    return 0;
}

#include <stdio.h>

int main()
{
    char c = 'A'; //c에 A라는 문자값을 넣는다.
    char d = 65;  //d에 아스키코드 65를 넣는다.
    
    char a = '\a'; //a는 beep소리 한번을내는 행위를 출력한다.
    printf("%c", a); // a를 문자형으로 출력한다

    return 0;
}

#include <stdio.h>

int main()
{
    float salary;
    printf("$______\b\b\b\b\b\b");//백슬래쉬 6번 앞에한상태에서 값을 출력한다
    scanf("%f", &salary); //salary라는 float변수를 입력해라

    return 0;
}

#include <stdio.h>

int main()
{
    printf("AB\tCDEF\n");//AB하고 탭 CDEF하고 한칸점프
    printf("ABC\tDEF\n");
    return 0;
}

#include <stdio.h>

int main()
{
    printf("\\ \'HA+\' \"Hello\" \?\n");//이스케입시퀀스로 출력에
// 제한이있는 문자들 출력하기 printf안에 무슨 찜찜한문자 넣으려거든 
//앞에\넣는 습관을 들이자
    
    return 0;
}

부동소수점형

#include <stdio.h>
#include <float.h>

int main()
{
    printf("%u\n", sizeof(float));
    printf("%u\n", sizeof(double)); //float의 두배메모리를 사용해서 double이다.
    printf("%u\n", sizeof(long double)); //long double도 8이나온다. gcc에선 16이 나온다.
    
    float f = 123.456f; //float는 리터럴 f를 붙여주는게 좋다
    double d = 123.456; //오히려 double은 안붙여도 무방
    
    float f2= 123.456f;
    double d2 = 123.456f;//float를 double에 넣으면 크기가 float이 더 작기 때문에 ㄱㅊ
    
    int i = 3;
    float f3 = 3.f; // 3.0f .을찍어줘야 한다 .없으면 정수로 취급될 수 있기 때문
    double d3 = 3.; // 3.0. double도 마찬가지
    
    float f4 = 1.234e10f;
    
    float f5 = 0xb.aP1; //16진수다. e대신 p를 적은것 
    double d5 = 1.0625e0;
    
    printf("%f %F %e %E\n", f, f, f, f);
    printf("%f %F %e %E\n", d, d, d, d);
    printf("%a %A\n", f5, f5);
    printf("%a %A\n", d5, d5);
    
    
}

불리언형

#include <stdio.h>
#include <stdbool.h> // 불자료형을 갖기 위해서 불헤드를 갖고온다

int main()
{
    printf("%u\n", sizeof(_Bool)); //특이하게 얘는 앞에 대문자가 나온다 bool의 크기는 1바이트
    _Bool b1;
    b1 = 0; //Bool_자료형에서는 0은 false고 1은 트루다 레알 참트루
    b1 = 1; //true
    
    printf("%d\n", b1);
    
    bool b2, b3;
    b2 = true;
    b3 = false;
    
    printf("%d %d\n", b2, b3);
    
    return 0;
    
    
}

Comments