✍️ 발단

strncmp코드에서 const char를 unsigned char로 형변환해서 계산하는 부분이 있다.이 부분에서 확장아스키가 들어올 수 있기 때문에 unsigned char를 사용해야한다고 설명했는데 이 설명만으로는 부족한 것 같아 동료들과 토론을 해보았다.

✨ 이 글을 이해하기 위한 기본지식

char형과 unsigned char형char과 unsigned char형은 모두 1byte(8bit)를 사용해서 표현한다.ㅁㅁㅁㅁ ㅁㅁㅁㅁ => 1bytechar형은 부호표현이 있으니 -128~127까지 unsigned char형은 부호표현이 없으니 0~255까지 표현할 수 있다

비트의 개념을 모른다면 <Hello, Computer World!_비트> 를 읽고 오면 이해가 쉬울 것이다.

❓ unsigned char와 char형은 어떻게 다를까

그럼 char형에 확장아스키코드 값(128~255)를 넣으면 어떻게 될까?일단 컴파일할수 없다.

컴파일 되지 않고 오버플로된 값을 알려주는 모습

컴파일 되지 않고 오버플로된 값을 알려주는 모습

그런데 컴파일러에서 150대신 -106을 넣으라고 추천해준다.8비트에 150을 넣었을 때 오버플로난 값을 계산해보면 -106이다. 이 뜻은 비트수가 똑같다는 뜻이다.150을 8비트로 계산했을 때도 10010110-106을 8비트로 계산했을 때도 10010110 이 된다.그럼 char a = -106인 값을 출력했을 때, 확장아스키150의 값을 얻을 수 있을까?

터미널에서 확장아스키코드 지원을 하지 않아 조건문을 이용해 출력했다.

a와 b가 같을 때 출력하라고 조건문을 주었는데 출력하지 않고 다를 때 출력하라는 조건문에서는 무언가 출력이 되었다. a와 b는 다르다는 뜻이다. 비트수는 같은데 왜 다를까?

https://velog.velcdn.com/images/ejay29/post/26fb3b3e-084d-4ba7-840c-995d045c780e/image.png

char형과 unsigned char형에 같은 비트값을 넣어서 출력한 모습

char형과 unsigned char형에 같은 비트값을 넣어서 출력한 모습

� 이 기호는 대체문자로 텍스트 인코딩, 디코딩이 잘못되었을경우 표시된다.a에서 출력된 �기호는 -106에 대응하는 아스키코드 값이 없다는 것을 의미하고b에서는 확장아스키는 표준이 아니므로 터미널에서 출력값과 매칭할 수 없어 출력이 불가능하다는 의미이다.