FCVT, FCVTZS, FCVTZU
Example
FCVT, FCVTZS, FCVTZU는 어셈블리어에서 가장 긴 이름을 자랑하는 축에 속함 이름에 공통으로 들어간 CVT는 Convert (변환)의 약자입니다. 즉, 이 친구들은 정수와 실수, 혹은 큰 실수와 작은 실수 사이의 경계를 넘나들며 “데이터의 옷(포맷)을 갈아입혀 주는 변환 전담 요원”들입니다. 왜 이름이 이렇게 길어졌고, 어떤 옷으로 갈아입히는지 세상에서 가장 이해하기 쉽게 3코스 요리로…
FCVT
Floating-point Convert (실수끼리 옷 갈아입히기)
- 이름의 풀이: Floating-point CVT (부동소수점 변환)
- 한 줄 요약: 정밀도가 낮은 소수(float)를 정밀도가 높은 소수(double)로, 혹은 그 반대로 바꾸는 명령어입니다.
💡 왜 필요한가요? (비유)
우리가 C언어나 자바 등에서 코딩할 때 float 변수(32비트)에 있던 값을 double 변수(64비트)로 옮기거나, 반대로 강제 형변환(Casting)을 할 때가 있습니다.
float a = 3.14f;double b = (double)a; // 32비트 옷을 64비트 옷으로 갈아입히기!
하드웨어 입장에서 32비트 전용 서랍(S 레지스터)에 있던 소수점 데이터를 64비트 전용 서랍(D 레지스터)으로 옮기려면 비트 규격을 완전히 재조정해야 합니다. 이때 FCVT가 투입됩니다.
- 실제 코드 예시 (ARM64):
FCVT D0, S1 ; 32비트 실수 S1을 가져와서 64비트 실수 D0로 확장 변환해라!
FCVT S2, D3 ; 반대로 64비트 실수 D3을 32비트 실수 S2로 다듬어서 줄여라!
FCVTZS
Floating-point Convert with Round toward Zero to Signed (실수를 부호 있는 정수로!)
- 이름의 풀이: Floating-point CVT toward Zero to Signed
- 한 줄 요약: 소수점 데이터(실수)를 소수점 아래는 다 잘라버리고 “부호가 있는 일반 정수(Signed Integer)”로 바꾸는 명령어입니다.
💡 왜 이렇게 이름이 길어졌을까요? (특수성)
이름 중간에 들어간 Z는 Round toward Zero (0을 향한 반올림)를 뜻합니다. 쉽게 말해 “소수점 이하는 무조건 버림(소멸)해라!”라는 뜻입니다. 수학에서 3.99가 들어오면 일반 반올림은 4가 되지만, FCVTZS를 거치면 소수점 아래를 칼같이 잘라버려서 3이 됩니다. abs()나 정수 변환의 규칙을 지키기 위해서죠. 그리고 맨 끝의 S는 Signed (부호 있음, 즉 마이너스 가능)를 뜻합니다.
double x = -5.75;int y = (int)x; // 소수점을 버리고 부호 있는 정수로 변환 -> 결과는 -5
이 고급 언어 코드를 컴퓨터 하드웨어 수준에서 실행할 때 바로 이 길고 긴 FCVTZS 명령어가 호출됩니다. 실수가 담긴 D 레지스터에서 값을 꺼내 소수점을 버린 뒤, 정수가 담기는 일반 X 레지스터로 이사해 줍니다.
- 실제 코드 예시 (ARM64):
FCVTZS W0, S1 ; 32비트 실수 S1의 소수점을 버리고(Z), 부호 있는 32비트 정수(S) W0로 변환!
FCVTZU
Floating-point Convert with Round toward Zero to Unsigned (실수를 부호 없는 양수 정수로!)
- 이름의 풀이: Floating-point CVT toward Zero to Unsigned
- 한 줄 요약: 소수점 데이터(실수)를 소수점 아래는 버리고, 이번에는 “부호가 없는 정수(Unsigned Integer, 오직 양수)”로 바꾸는 명령어입니다.
💡 FCVTZS와 무엇이 다른가요?
맨 끝 알파벳이 U (Unsigned, 부호 없음)로 바뀌었습니다. 마이너스 숫자가 절대 나오지 않는 오직 양수 정수의 서랍으로 데이터를 옮길 때 씁니다.
float a = 12.34f;unsigned int b = (unsigned int)a; // 소수점 버리고 양수 전용 정수로 변환 -> 결과는 12
만약 실수 데이터가 12.34였다면 소수점이 잘려서 양수 12가 되어 아무 문제가 없습니다. 하지만 만약 실수 데이터가 음수(-12.34)였다면 어떻게 될까요? 부호 없는 정수(Unsigned)는 음수를 표현할 수 없기 때문에, 이 명령어가 작동하면서 하드웨어적으로 최대치 값이나 에러(Overflow) 플래그를 발생시키며 안전장치를 작동시킵니다. U가 붙었기 때문에 하드웨어가 “이 서랍은 양수만 들어올 수 있어!” 하고 정밀 검사를 한 번 더 하는 셈이죠.
- 실제 코드 예시 (ARM64):
FCVTZU W0, S1 ; 32비트 실수 S1의 소수점을 버리고(Z), 부호 없는 정수(U) W0로 변환!
🧱 후진 양성 마크다운 교본용: 변환(Convert) 요원 최종 정리 판넬
| 니모닉 이름 | 중간/끝 알파벳의 의미 | 출발 데이터 (어디서) | 도착 데이터 (어디로) | 후진들을 위한 직관적 요약 |
|---|---|---|---|---|
| FCVT | CVT (Convert) | 부동소수점 실수 | 부동소수점 실수 | float ↔ double “실수 동네 안에서 옷 크기만 바꾸기” |
| FCVTZS | Zero 버림 + Signed 정수 | 부동소수점 실수 | 부호 있는 정수 (int) | 3.99 ➡️ 3, -5.7 ➡️ -5 “소수점 칼같이 자르고 일반 정수로 이사” |
| FCVTZU | Zero 버림 + Unsigned 정수 | 부동소수점 실수 | 부호 없는 정수 (unsigned) | 12.34 ➡️ 12 “소수점 자르고 오직 양수 전용 정수로 이사” |
F(실수에서) ➡️ CVT(변환해서) ➡️ Z(소수점 버리고) ➡️ S/U(정수로 보낸다) 라는 하드웨어의 정직한 동작 흐름이 이름에 고스란히 정직하게 박혀있었던 것뿐이었습니다!