ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 004. 음의 정수 표현(2의 보수), 실수 표현 방식의 이해, 상수와 형 변환, 연산자
    SsY/Class 2023. 2. 11. 18:25
    728x90

    2023.01.30 (월)

    음의 정수 표현 ( 2의 보수)
    - 10진수 음의 정수를 2진수로 어떻게 표현하는가?
    • 음의 정수 표현 문제/풀이 : 2의 보수 사용
    ① '-10' 을 byte 기반의 비트열로 나타낸다. > 11110110

    10의 양수 byte열 00001010
                    → 반전 11110101      : 1의 보수
                     → +1   11110110      : 2의 보수

    검산 00001010
     +      11110110
    ---------------------
          100000000
    8bit를 벗어난 1은 제외되어 > 00000000 = '0'

    ⑤ byte 기반의 11001010 을 10진수 정수형으로 나타낸다. > -54

    11001010 "                   음의 정수" '-'                
    → 00110101  (반전)                                          
    →+       1
    → 00110110 = 2+4+16+32 = 54

    방법 [A]
          10진수 대상 양수 ...  비트열    
    1.          1의 보수(비트열 반전)       
                              ↓↑                         
    2.                  1을 더함                    
                             ↓↑                          
     3.     10진수 대상 음수 ... 비트열  
    --==>> 즉 역순으로 진행! 1을 빼고 1의 보수(비트열 반전) 진행 = 양수 비트열 

    방법 [B]
    역순으로 진행이 아닌 그대로 똑같이 보수 > + 1 진행
    = 동일한 결과 값이 나온다!

    가장 앞에 오는 비트 0 : 양수/ 1: 음수를 나타내며 이를 부호화 비트 (MSB)라고 한다.

    더보기

    ① '-10' 을 byte 기반의 비트열로 나타낸다. > 11110110

    10의 양수 byte열 00001010
    → 반전 11110101
    → +1   11110110

    검산 00001010
     +   11110110
    --------------
        100000000
    8bit를 벗어난 1은 제외되어 > 00000000 = '0'


    ② '-27' 을 byte 기반의 비트열로 나타낸다. > 11100101

    27의 양수 byte열 00011011
    → 반전 11100100
    → +1   11100101

    검산 00011011
     +   11100101
    --------------
        100000000
    8bit를 벗어난 1은 제외되어 > 00000000 = '0'

    ③ '-31' 을 byte 기반의 비트열로 나타낸다. > 11100001

    31의 양수 byte열 00011111
    → 반전 11100000
    → +1   11100001

    검산 00011111
     +   11100001
    --------------
        100000000
    8bit를 벗어난 1은 제외되어 > 00000000 = '0'

    ④ '-13' 을 byte 기반의 비트열로 나타낸다. > 11110011

    13의 양수 byte열 00001101
    → 반전 11110010
    → +1   11110011

    검산 00001101
     +   11110011
    --------------
        100000000
    8bit를 벗어난 1은 제외되어 > 00000000 = '0'

    ⑤ byte 기반의 11001010 을 10진수 정수형으로 나타낸다. > -54

    11001010 "음의 정수" '-'
         → 00110101  (반전)
         →+       1
         → 00110110 = 2+4+16+32 = 54

     [A] 10진수 대상 양수 ...  비트열    ┐

    1.          1의 보수(비트열 반전)       │
                              ↓↑
    2.                   1을 더함                    │
                             ↓↑
     3.      10진수 대상 음수 ... 비트열  ┘

    즉 역순으로 진행! 1을 빼고 1의 보수(비트열 반전) 진행 = 양수 비트열 

     [B] 역순으로 진행이 아닌 그대로 똑같이 보수 > + 1 진행
         

    ⑥ byte 기반의 11110101 을 10진수 정수형으로 나타낸다. > -11

     11110101 
    -       1
           ------------
             11110100
    → 반전 00001011
    → 양의 정수 15-(4) = 11

    11110101 "음의 정수" '-'
         → 00001010 (반전)
         →+       1
         → 00001011 = 1+2+8 = 11


    ⑦ byte 기반의 1000001 을 10진수 정수형으로 나타낸다.> -127

     10000001
    -       1
           ------------
             10000000
    → 반전 01111111
    → 양의 정수 128-(1) = 127

    ⑧ byte 기반의 10101010 을 10진수 정수형으로 나타낸다. > -86

     10101010 
    -       1
           ------------
             10101001
    → 반전 01010110
    → 양의 정수 2+4+16+64 = 86

    10101010 "음의 정수" '-'
         → 01010101 (반전)
         →+       1
         → 01010110 = 2+4+16+64 = 86

    ⑨ byte 기반의 10000101 을 10진수 정수형으로 나타낸다. > -123

     10000101 
    -       1
           ------------   
             10000100        
    → 반전 01111011
    → 양의 정수 -4+127 = 123
     
    ⑩ byte 기반의 11111111 을 10진수 정수형으로 나타낸다. > -1

     11111111 
    -       1
           ------------
             11111110
    → 반전 00000001
    → 양의 정수 1

     

    Java의 기본 자료형과 실수표현 방식의 이해
     - Java의 기본 자료형 (설명)
     - 정수의 기본형 int / 실수의 기본형 double
    • Java의 기본 자료형 (설명)
    문자 데이터 메모리크기
    7 정수형 7 int (4바이트)
    7.0 실수형 7 double (8바이트)
    '7' 문자형 7 ASCII 코드로 저장 55(37)  됨
    "7" 문자열(문자 집합) 7 객체
    • 실수 표현 방식의 이해

    - 모든 실수를 표현할 수 있는 방법은 존재하지 않는다.
      (0과 1사이에도 무수히 많은 실수가 존재)
    - 정밀도를 포기하고 표현할 수 있는 값의 범위를 늘려서 표현하기로 정함
    - 실수 또는 실수의 근사치를 표현하는 수식을 만들어 변수의 값만 메모리에 저장하여 도출해낼 수 있도록 함

    - 아무리 데이터의 정밀도를 포기했다 하여도 그래도 가장 정밀도를 높일 수 있는 double 형태로 표기하기로 함
      (float 이나 double 둘 다 long을 표현할 만큼 범위는 충분하지만 반복 될 수록 오차가 점점 커지기 때문)

    • int 형을 정수의 기본형으로 사용하는 이유?

    - 기본적으로 자바연산 → 32비트 기반
    - 데이터가 적다고 byte 또는 short 기반으로 저장을 하게 되면 불필요한 변환 과정 및 값의 저장이 필요하기 때문에 이를 줄여 속도를 빠르게 함
    - 빠른 연산이 필요하지 않을 경우에 byte 또는 short를 사용하여 적은 데이터를 소모하여 저장한다
      (
    저장은 byte로 - 연산은 int로 변환하여 계산)
       연산보다 데이터의 양, 데이터 성격(저장)이 중요시 되는 상황 ex) mp3파일, 동영상 파일

     

    상수와 형 변환 (+ 접미사)

     

    • 상수  : 변수의 반대로, 담는 개념이 아니다.
           --==>> 1은 1로 담아두기 때문에 이름(변수)가 없어 재접근 및 값의 수정이 불가능하다.
                       사용 후에는 (가비지 컬렉터가 지나가고 자동) 소멸한다.
      (가비지 컬렉터가 지나가기 전에는 데이터가 남아 있기 때문에 날아간 데이터의 복구를 시도해 볼 수 있다)

     

    • 형 변환 : 데이터 타입 형태를 변환 하는 것
      ex) int → byte, long → double 등...

           - 바꾸는 이유 :  연산(처리)를 하기 위해서

    더보기

    int a = 10000000000;             // --- (백억) 에러
    long a = 10000000000;          // --- (백억) 에러

    이유 : '=' 오른쪽을 먼저 확인하기 때문에 먼저 백억을 정수를 표현하는 기본 자료형인 int 로 데이터를 확보하려고 하기 때문에 에러가 나서 long 타입 임을 인식 x

     ※ 접미사를 이용한 상수 표현 방식의 변경     long a = 10000000000L;                            
    // 접미사 L (소문자도 상관x) - 해당 데이터를 long 타입으로 인식하여 저장하라고 하는 의미를 지님

     
    • 자동 형 변환 규칙 
    ※ 자동 형 변환 규칙
    byte → short
                          ↘
                               int → long → float → double
                          ↗
                  char
      1          2           4          8          4             8

    작은 데이터 타입에서 큰 데이터 타입으로 필요할때 자동으로 변환 시켜 줌
    (역으로도 형 변환은 가능함, 다만 데이터의 모양이 변환 될 수 있음)

    long → float
    1. 데이터 타입이 작은데 어떻게 바꿀 수 있는지?
    - float의 표현범위가 더 넓기 때문에 가능하다

    char
    2. 문자 타입의 바이트가 숫자 타입으로 변환할 수 있는지?
    - 문자 자체로 저장되어 있는 구조가 아닌, 유니코드로 변환되어 숫자의 형태로 저장되기 때문에 변환이 가능하다
    더보기

    ■ ex) double num2= 3.5f +12;
    1) 3.5f + 12
       (float) (int)
    데이터 단위가 같지 않기 때문에 바로 계산이 불가능
    자바 내부에서 자동적으로 자동 형 변환 규칙에 의해 int → float 가 된다

    2) 3.5f + 12.0(f)
    double num2= 15.5f;

    3) 연산에서의 대 전제는 타입이 같아야한다
       자동 형 변환 규칙에 의해 float → double 로 변환되어야한다.  
       → num2 에 담겨있는 상수는 15.5 이며 데이터 타입은 double 일 것이다.


    ■ 명시적            ↔    묵시적(암시적)
       ㄴ강제 형 변환          ㄴ 자동 형 변환

    ※ 강제 형 변환이 일어나는 때
    1. 자동 형 변환 규칙 위반 (위배) but 해야 할 때
    2. (다른 팀원들 또는 미래의 나 자신에게)(묵시적으로 자동 형 변환이 될 것을 알고있지만) 여기서 형 변환을 의도적으로 수행하였음을 명시하기 위해서
    - 강제 형 변환 ( 큰 곳에서 > 작은 곳으로 옮길 때)
      double 에 담긴 데이터가 충분히 float 에도 담길 수 있을 데이터 양일 때
      데이터를 조금 뭉뚱그려서 강제로 float으로 담아놓는 것
       float y = 3.14F;               // 접미사 F(소문자도 상관x)
    더보기

    ■ ex1)  long num1 = 21억 L;
             int num2 = (int)num1;
                     ----- long형 21억
                -----
          ()는 연산자에 해당한다
                        → int형 21억;

    ■ ex2)  int num3 = 100;         --- int
     long num4 = (long)num3;
     
     int → long 으로 자동 형 변형 되기 때문에 쓰지않아도 문제가 되는 구문은 아니나, 의도적으로 형 변환을 일으킨 것을 명시

     

    연산자
          * ~~자 :   ~~ -er, -or ~을 하는 사람이나 장치
    - 단항 연산자
    - 이항연산자
    - 복합 대입 연산자
    - 관계 연산자
    - 논리 연산자 
    ■ 단항 연산자
      +/- 부호 연산자 (음수, 양수를 나타낼 때만) *특히 - 는 부호를 바꾸는 역할을 한다. 
       ex) -5 , -(-5) , 덧셈은 하는 일이 없다
    * 증감 연산자
      ++증가 연산자 -- 감소 연산자
      1만큼 증가시켜라 1만큼 감소시켜라
    (Prefix) ++a; --a;
    지금 당장
    (Postfix) a++; a--;
    다음 행에서, 다음 처리에서
    ■ 이항 연산자 
      방향 *비고
     (type)   ←  
    사칙연산 * / > + - 
    우선순위
     
    = (대입연산자) 
    우선 순위가 매우 낮음
    관계연산자(같다)가 아님을 인지하고 결합방향이 반대쪽(오른편에서 왼쪽)으로 대입이 진행됨을 확인하자!
      * '/ ' 정수/정수 일 때는 오로지 몫을 취한다
      * '%' 몫을 제외하고 나눈 나머지만을 취하는 연산자
    ■ 복합 대입 연산자
    a += 10 a 를 10 만큼 증가 시켜라
    -= a 를 10 만큼 감소 시켜라
    *= a 를 10 만큼 곱해라
    /= a 를 10 만큼 나눠라
    ■ 관계 연산자 : 연산 결과는 true 또는 false 로 반환
    > , < (부등호) 크다, 작다
    <=, >= 작거나 같다, 크거나 같다
    == 같다
    != 같지 않다
    ※ '=' 는 대입연산자가 먼저 만들어지면서 선점했음
    ■ 논리 연산자 : 수식이 2개 이상 올 때 무조건 사용됨
    && 논리 and 연산자 그리고(~이면서)
    || 논리 or 연산자 또는 (~이거나)
    ! 논리 not 논리 부정
    ex ) !참 == 거짓 , !거짓 == 참

    ※ SCE (최단거리 연산) : 참/ 거짓을 확인하는데 논리 and 연산자 앞에서 거짓이 나오면
                                            뒷 부분 연산을 하지 않아도 거짓임을 알 수 있기 때문에 계산하지 않고 종료
                                            논리 or  연산자 앞에서 참이 나오면 뒷 부분 연산을 하지 않아도 이기 때문에
                                            뒷 부분을 계산하지 않고 종료

     

    // 개인적 감상

    더보기

    이미 무언가 그려져있던 도화지에 덧칠을 해서 새로운 그림을 그리는 것보다 새하얀 새 도화지에 그리는 것이 쉽듯,  무작정 외우기 보다 갖고 있던 상식을 컴퓨터언어 입장에서 생각하기 위해서 조금씩 바꿔서 생각해야하는 점들에 까다로움을 느꼈다.

    그렇지만 아직까지는 어렵거나 좀 적성에 안맞지는....않을지도?라는 생각을 해본다

    728x90
Designed by planet-si