프로그래밍임베디드 개발자 / 시스템 개발자

러스트에서 타입 캐스팅(type casting)은 어떻게 작동하나요? 숫자 타입 간의 캐스팅 사용 시 특징과 잠재적 위험은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

러스트에서 타입 캐스팅(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) 이는 값이 잘리게 되었고, 그로 인해 데이터가 잘리고 큰 파일 전송 시 오류가 발생했습니다.