Java 기초 -자료형의 표현, 형변환, 메모리의 이해-

QNamelessQ·2022년 12월 28일
1

Java

목록 보기
2/3

1. 음의 정수 표현법

정수에의 1의 보수에 1을 더함(2의 보수)
이후 '정수'와 '2의보수'를 더함
이후 맨 앞자리 1을 버림



2. 실수의 표현 방식의 이해

◆ 컴퓨터의 메모리 유한성

컴퓨터가 계산을 할 때, 사용할 수 있는 메모리의 값은 한정되어 있다.

따라서 컴퓨터가 연산에 사용할 값의 최대, 최소값을 정해둔 뒤
부분마다 표현가능한 수를 미리 지정해둔다.

이후 표현 가능한 수 이외의 값이 들어올 경우,
그에 가장 가까운 값을 대체입력하게 되고
그에 따라 오차범위가 발생하게 된다.

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


3. short와 int

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에 관한 이해가 필요하다

▣ OS의 32bit? 64bit?

운영체제의 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는 무슨말?

▣ short와 int의 차이

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; 같이 명시적 형변환이 필요하다.

▣ 마찬가지로 실수도 double로 설정

실수를 처리할 때, float or double이 있는데
리터럴 값은 double로 설정되는 것도 있고,

float은 소수점 6자리까지, double은 소수점 15자리까지 설정하는데
이에 따라 정밀도도 double이 더 높기 때문에
double로 잡아주는 것이 좋음



4. 컴퓨터 상에 문자가 출력되는 원리

ASCII Code

숫자와 문자의 1:1 매칭
대문자 A는 ASCII 코드로 65
소문자 a는 ASCII 코드로 97

#include <stdio.h>
#pragma warning(disable:4996)

main()
{
	char a;
	scanf("%c", &a);
	printf("%d", a);
}


References

  1. https://foameraserblue.tistory.com/190
profile
Hello World

2개의 댓글

comment-user-thumbnail
2022년 12월 28일

감사합니다! 도움이 많이 되었어요~^^

1개의 답글