목차
비트와 바이트
//Bit = 0, 1만 들어가는 최소의 단위
//Byte = 8개의 Bit로 구성된 것
바이트(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;
}