오늘 회사에서 코드 리팩터링을 하면서 실수한 부분을 사수님이 발견해주셨다.
조금 뿌리깊게 박혀서 int형을 포기하지 못해서 long long data를 타입 캐스팅해서 넣어준 코드를 짰는데, 이 부분이 잘못 되어 있었다.
대부분 이러한 코드를 짜진 않을테지만 혹여나, 비트에 민감한 Low Level 코드를 다루실 분들을 위해 포스팅 하고자 한다.
문제의 코드는 다음과 같다.
void log(unsigned long long date, int *arg){
// arg 배열의 개수는 2개 인 상황
*(unsigned long long *)arg = date;
}
나는 이 코드에서 오해했던것이
예를들어 매개변수 date의 값이 0x1234567898765432 라고 했을 경우
arg[0] = 0x12345678
arg[1] = 0x98765432
위의 결과라고 예측 했던것이다.
하지만 실제로 코드를 돌려보면
이런식으로 반대로 들어가게 된다.
서로 다른 크기의 비트를 가진 형 변환을 할때는 주의할 필요가있다.
실제 값의 비트는 메모리에서 저장하는 방식에 반대로 뒤에서부터 값이 꽂힌다는 사실을 숙지할 필요가있다.