건조젤리의 저장소

16진수 문자를 출력할때 "ffffff" 출력 현상 본문

프로그래밍/C

16진수 문자를 출력할때 "ffffff" 출력 현상

건조젤리 2018. 10. 9. 13:45

코드

#include <stdio.h>
int main(void)
{
int i[5][5] = {
{ 0x01,0x02,0x03,0x04,0x05 },
{ 0x06,0x07,0x08,0x09,0x10 },
{ 0x11,0x12,0x13,0x14,0x15 },
{ 0x16,0x17,0x18,0x19,0x20 },
{ 0x80,0x81,0xAA,0xDD,0xFF }
};
char *pt = (char *)i;
for (int j = 0; j < 25*4; j++)
{
printf("%X ", *pt++);
if (((j+1) % 4) == 0)
printf("\n");
}
return 0;
}





출력

1 0 0 0
2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 0 0 0 7 0 0 0 8 0 0 0 9 0 0 0 10 0 0 0 11 0 0 0 12 0 0 0 13 0 0 0 14 0 0 0 15 0 0 0 16 0 0 0 17 0 0 0 18 0 0 0 19 0 0 0 20 0 0 0 FFFFFF80 0 0 0 FFFFFF81 0 0 0 FFFFFFAA 0 0 0 FFFFFFDD 0 0 0 FFFFFFFF 0 0 0


먼저 전체적인 코드는 int 형 배열의 내용을 char 형 포인터 변수를 통해 출력하는것 입니다.


int 형 자료형

 4byte = 32bit

char 형 자료형

 1byte = 8bit


char 형 포인터의 주소를 4번 늘려가면 int 형 배열 하나의 값을 알 수 있을것 입니다.


하지만 0x80 (128)부터 앞에 정체모를 "FFFFFF" 값이 붙는것을 볼 수 있는데 왜 붙는 걸까요.

이는 char 형 자료형이 나타낼 수 있는 범위를 알면 쉽게 이해할 수 있습니다.


출처 : https://m.blog.naver.com/PostView.nhn?blogId=brickbot&logNo=220453565505&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


char 형 자료형은 127 이상의 수를 표현할 수 없습니다.

따라서 128이 출력되는 것이 아니라 -128 이 출력된 것이였습니다.


그럼 이 문제를 어떻게 해결할 수 있을까요?


간단히 값의 범위가 크거나 값의 범위가 적절한 자료형을 이용하면 해결됩니다.


지금 제가 만든 int 형 배열 안의 값들은 1부터 255 까지의 값을 가지고 있습니다.


그렇다면 0부터 255 까지의 값을 표현 가능한 unsigned char을 이용하면 되는 것이죠.





코드

#include <stdio.h>
int main(void)
{
int i[5][5] = {
{ 0x01,0x02,0x03,0x04,0x05 },
{ 0x06,0x07,0x08,0x09,0x10 },
{ 0x11,0x12,0x13,0x14,0x15 },
{ 0x16,0x17,0x18,0x19,0x20 },
{ 0x80,0x81,0xAA,0xDD,0xFF }
};
unsigned char *pt = (unsigned char *)i;
for (int j = 0; j < 25*4; j++)
{
printf("%X ", *pt++);
if (((j+1) % 4) == 0)
printf("\n");
}
return 0;
}





출력

1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 0 0 0 7 0 0 0 8 0 0 0 9 0 0 0 10 0 0 0 11 0 0 0 12 0 0 0 13 0 0 0 14 0 0 0 15 0 0 0 16 0 0 0 17 0 0 0 18 0 0 0 19 0 0 0 20 0 0 0 80 0 0 0 81 0 0 0 AA 0 0 0 DD 0 0 0 FF 0 0 0


참고 : https://stackoverflow.com/questions/7496657/when-printing-hex-values-using-x-why-is-ffffff-printed-after-each-value

Comments