-
004. 음의 정수 표현(2의 보수), 실수 표현 방식의 이해, 상수와 형 변환, 연산자SsY/Class 2023. 2. 11. 18:25728x90
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
→ 양의 정수 1Java의 기본 자료형과 실수표현 방식의 이해
- 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 논리 부정
※ SCE (최단거리 연산) : 참/ 거짓을 확인하는데 논리 and 연산자 앞에서 거짓이 나오면
뒷 부분 연산을 하지 않아도 거짓임을 알 수 있기 때문에 계산하지 않고 종료
논리 or 연산자 앞에서 참이 나오면 뒷 부분 연산을 하지 않아도 참이기 때문에
뒷 부분을 계산하지 않고 종료// 개인적 감상
더보기이미 무언가 그려져있던 도화지에 덧칠을 해서 새로운 그림을 그리는 것보다 새하얀 새 도화지에 그리는 것이 쉽듯, 무작정 외우기 보다 갖고 있던 상식을 컴퓨터언어 입장에서 생각하기 위해서 조금씩 바꿔서 생각해야하는 점들에 까다로움을 느꼈다.
그렇지만 아직까지는 어렵거나 좀 적성에 안맞지는....않을지도?라는 생각을 해본다
728x90'SsY > Class' 카테고리의 다른 글
006. 클래스명 표기법, BufferedReader, System.in.read/skip() 실습 (0) 2023.02.17 005. 비트 연산자, 변수와 자료형 / 키워드 및 식별자 / 연산자 실습, final(상수화) (0) 2023.02.15 003. EditPlus , 자바의 기본 프로그래밍 & 자료형 (1) 2023.02.11 002. 메모장 코딩 (FirstJavaProgram.java), JVM(자바가상머신) (0) 2023.02.11 001. 기초 환경 설정 (1) 2023.02.11