정수에의 1의 보수에 1을 더함(2의 보수)
이후 '정수'와 '2의보수'를 더함
이후 맨 앞자리 1을 버림
컴퓨터가 계산을 할 때, 사용할 수 있는 메모리의 값은 한정되어 있다.
따라서 컴퓨터가 연산에 사용할 값의 최대, 최소값을 정해둔 뒤
부분마다 표현가능한 수를 미리 지정해둔다.
이후 표현 가능한 수 이외의 값이 들어올 경우,
그에 가장 가까운 값을 대체입력하게 되고
그에 따라 오차범위가 발생하게 된다.
public class Test2 {
public static void main(String[] args) {
double num1, num2;
double result;
num1=1.0000001;
num2=2.0000001;
result=num1+num2;
System.out.println(result);
// res = 3.0000001999999997
public class Test2 {
public static void main(String[] args) {
short num1 = 11;
short num2 = 22;
short result = num1 + num2;
System.out.println(result);
}
}
/*
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to short
at Test2.main(Test2.java:7)
*/
이에 대한 설명을 하기 앞서,
먼저 운영체제의 bit에 관한 이해가 필요하다
운영체제의 bit는
CPU가 한 번에 처리할 수 있는 크기를 정해놓은 것인데
32bit 기준으로는
연산을 시도하거나 메모리 주소를 관리할 때,
한 번에 최대 32bit까지만 처리를 할 수 있다는 말이다.
32 bit 시스템일 때
메모리에 표현할 수 있는 값은 0 ~ 2^32 (메모리는 음수가 없음)
따라서 32bit로는 메모리를 한 번에 4GB까지만 사용할 수 있게 됨
1KB = 1024Byte (2^10 Byte)
1MB = 1024KB (2^20 Byte)
1GB = 1024MB (2^30 Byte)
4 * 2^30 = 4 * 1024^3 = 4Byte * 1GB = 4GB
참고링크 : 32bit 시스템인데 메모리는 4GB는 무슨말?
JVM은 고정 32bit system,
OS가 64bit여도 JVM은 32bit이기 때문에 CPU 계산에 32bit까지 쓸 수 있음
이를 토대로 바로 위 운영체제 bit와 연관지어 생각해보자
a라는 변수를 short로 지정하여 정수값을 받는다고 하자
java를 기준으로 short는 2byte니까 16bit를 메모리에 할당함
short a;
메모리는 직접 연산할 수 없기 때문에 CPU에 보내게 되는데
이때, 변수short a
에 리터럴 형태로 저장할 경우
CPU 입장에서는 이 리터럴 데이터의 타입이 무엇인지는 알 수가 없고,
따라서 그냥 단순히 32bit를 전부 사용하여 데이터를 보내게 됨32bit를 사용하는 정수는 4byte 크기, 즉 int형이다.
그런데, 메모리에 명시된 변수
a
의 크기는 16bit인데
그곳에 저장할 값의 크기는 32bit이므로 메모리의 크기를 넘치게 된다.따라서 전제를 int로 설정하거나,
short a = (short) 11;
같이 명시적 형변환이 필요하다.
실수를 처리할 때, float or double이 있는데
리터럴 값은 double로 설정되는 것도 있고,float은 소수점 6자리까지, double은 소수점 15자리까지 설정하는데
이에 따라 정밀도도 double이 더 높기 때문에
double로 잡아주는 것이 좋음
숫자와 문자의 1:1 매칭
대문자 A는 ASCII 코드로 65
소문자 a는 ASCII 코드로 97
#include <stdio.h>
#pragma warning(disable:4996)
main()
{
char a;
scanf("%c", &a);
printf("%d", a);
}
감사합니다! 도움이 많이 되었어요~^^