Re: void 포인터 연산시 왜 unsigned char포인터를 써야하나요?
, 도장_ 관리자님이 작성이미 답변했지만,
메모리 주소에 부호 있는 정수 타입을 쓰면 안 됩니다.
올바르게 동작하지 않는다, 프로그램이 중단되는 예시 코드도 넣었습니다.
비부호 정수로 처리해야 한다. 관례다.
부호 정수로 처리하면 처리과정에서 오동작을 일으키고 프로그램이 죽는다. 툭하면 죽는 프로그램을 작성하고 싶다면 쓰시면 된다. 다른 프로그래밍 언어는 아예 금지한다.
됐죠?
그러면 왜 관례가 unsigned를 쓰는 것이냐? C 언어 역사가 그렇고, 표준이 그렇다. 심지어 char의 부호도 표준에서 정해지지 않았다. ARM에서는 char라고 쓰면 디폴트가 unsigned char이다.
이렇습니다.
void 포인터로 연산하면 안 됩니다.
음수를 저장할 때 2의 보수 형태로 저장하게 됩니다. 단순히 부호 여부가 아니라 데이터를 저장하는 방식이 달라집니다.
다시 돌아가서 봅시다.
문의한 표준 코드에서도 ARM 아키텍처이면 unsigned char로 캐스팅할 필요가 없습니다.
그러면 아키텍처에 따라서 unsigned char로 캐스팅하는 것과 안 하는 코드를 작성하는 것이 좋을까요? 일관되게 명확하게 unsigned char로 캐스팅하는 것이 더 낫지 않을까요?
부호 여부는 비트 연산에서 심각하게 다른 차이를 만듭니다. 비부호여야 정확하게 동작할 겁니다.
10000000 >> 1 = 01000000 (128 / 2 = 64)
10000000 >> 1 = 11000000 (-128 / 2 = -64)
char의 부호는 구현체마다 다릅니다. 의도를 명확하게 표시하는 게 더 낫습니다.
표준까지 찾아서 문의할 정도면 코딩 도장 학습자가 아닌데요. 책에 대한 문의만 답변합니다.
더 이상의 답변은 무의미한 것으로 보입니다.