Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

mommy computer

초기화(initializing) / 오버플로우(overflow) 본문

Programming/Java

초기화(initializing) / 오버플로우(overflow)

Dahn 2016. 10. 24. 12:15

1. 변수 선언 방법

ex. 10  20  30  3개의 데이터 변수 선언하기

    int num1;

    int num2;

    int num3;

 

    num1=10;

    num2=20;

    num3=30;

 

    이때 같은 자료형 타입은 한번에 선언할 수 있다.

    int num1, num2, num3;

 

2. 초기화(initialize)

- 변수는 자료형이라고 선언되었기 때문에 CPU로부터 bit의 크기(개수)를 확보해놓은 상태이다.

  따라서, 다룰 수 있는 수의 범위가 존재한다.

  그런데, 그 영역에 값을 넣지 않은 상태에서 출력하게 되면 문제가 발생한다.

ex. int num;

    syso(num); //Error. The local variable num may not have been initialized.

- 변수를 선언할 때, 확보해놓은 비트의 흔적이 남아있게 된다.

- 이것을 "잔류비트"라고 하며, CPU 메모리를 잡아먹기 때문에 아무렇게나 특정 값을 넣어놓은 후, 변수를 사용한다.

- 이렇게 특정 값을 넣는 것을 "초기화"라고 한다.

- 특정값에 기본값을 넣어주면 된다.

ex. int num = 0;

    int thisYear = 2016;

    int add = num + thisYear;

    char = ' '; (공백문자) 

    String = ""; (빈문자열)

    double = 0.0;

    float = 0.0F;

    long = 0L;

 


 

3. 범위 초과(overflow) : 자료형마다 확보할 수 있는 비트가 다르기 때문에 발생하는 현상

- 변수는 타입을 갖고 있다. 그리고 그에 따라 확보해놓은 비트가 존재한다.

ex. byte b1 = 128; 은 표현할 방법이 없어서 에러가 난다.

    byte b1 = 127+1; byte가 표현할 수 있는 한계치 넘어가지만, 식의 표현자체는 문제가 없다.

ex. byte b1 = (byte)(127+1);

    System.out.println(b1);

    그러나, 위 식의 출력값은 128이나 error가 아닌 -128이다. WHY?

 

* 수의 체계

사람 : 10진수 - 한 개의 자리값에 0~9까지 총 10개의 숫자를 표현할 수 있음

컴퓨터 : 2진수(binary digit, bit) - 한 개의 자리값에 0 또는 1을 이용한 숫자를 표현할 수 있음

           비트단위로 계산하고 코딩을 하는 것이 더 가볍고 빠르기 때문에 모바일에서 특히 2진수가 유용함

 

1byte = 0~255까지 표현할 수 있음 (2의 8승이 256)

컴퓨터는 8승 자리의 자릿값을 MSB(Most Significant Bit=Sign Bit)라고 하고, 1일경우 음수, 0일경우 양수로 지정한다.

 

* 진법 변환

- 양수는 그대로 2진법의 계산법을 따르면 되나, 음수의 경우 진법계산의 규칙을 따르지 않는다.

- 연산할 때 data bit 영역을 초과했다, 그래서 음수가 되는 현상을 overflow라고 한다.

- 따라서, 1byte 안에 128을 직접 넣을 경우 에러가 나고, 127+1로 연산했을 때는 비트가 초과된 값이 나타난다.

  이를 오버플로우(overflow)라고 한다. 비트는 순환되며 양수와 음수를 번갈아가며 출력한다.

 

1000 0000(2) = -128 (원래 규칙을 따르자면 -0에 해당하지만, 음수인 0은 존재할 수 없기 때문에 -128으로 정함)

1000 0001(2) = -127

1111 1110(2) = -2 

1111 1111(2) = -1

0000 0000(2) = 0

0000 0001(2) = 1

0111 1111(2) = 127

 

* 2의 보수법

- 음수를 표현하기 위해 '2의 보수법'을 사용한다.

(1) 오른쪽 > 왼쪽 방향으로 내려적는다.

(2) 최초의 1을 만나면 그 다음 비트부터 

(3) 1은 0으로, 0은 1로 변경한다

(4) 변경한 비트값으로 십진법 치환계산을 한다.

Comments