러스트에서 타입 캐스팅(type casting)은 as 키워드를 사용하여 수행됩니다. 이는 한 타입을 다른 타입으로 명시적으로 변환합니다:
let x: i32 = 10; let y: u8 = x as u8;
러스트는 C나 C++와 같이 암묵적 변환(implicit cast)을 수행하지 않습니다. 이는 데이터 손실이나 오버플로우와 관련된 많은 오류를 방지합니다.
특징:
잠재적 위험:
i32에서 u8로 캐스팅 시, 값이 범위를 초과하면 불필요한 상위 비트가 제거됩니다. 이는 예기치 않은 동작을 초래할 수 있습니다.예:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, 왜냐하면 300 % 256 = 44
i8타입의 음수를as키워드를 사용하여u8타입으로 변환하면 무엇이 발생하나요?
답변: 값이 컴파일 오류나 실행 시 패닉을 발생시키지 않습니다. 대신, 값의 비트는 부호 없는 수로 해석됩니다:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
이야기
금융 애플리케이션에서 송금 금액 데이터는 처음에 i32로 저장되었습니다. 개발자는 경계 체크 없이 이를 u32로 변환하기로 결정했으며, 이로 인해 음수 값 처리가 잘못되어 금액이 예기치 않게 큰 양수로 변환되어 비즈니스 로직 검증을 통과했습니다!
이야기
마이크로컨트롤러용 게임에서 가속도 레벨 전환은 두 레벨 값의 차로 계산되었고, 결과는 음수가 될 수 있었습니다. 결과를 반올림하기 위해 as u8 캐스팅을 사용했으며, 오버플로우를 무시했습니다. 그 결과 속도가 최대 수준에서 "정지"하게 되었고, 음수 값이 래핑 동작으로 인해 큰 양수로 변환되었습니다.
이야기
네트워크 애플리케이션에서 데이터 버퍼를 복사할 때 길이는 포인터의 차이(usize)로 계산된 후 as를 통해 u32로 변환되었습니다. 메모리 양이 많을 경우(>4GB) 이는 값이 잘리게 되었고, 그로 인해 데이터가 잘리고 큰 파일 전송 시 오류가 발생했습니다.