구조 잡기

Width가 큰 값일 때

( @쑤 의 아이디어 착안)

width의 크기가 굉장히 큰 경우에는 어떻게 출력할 지 궁금했습니다.

(이유는 알 수 없지만) width가 int의 최대 값을 넘어가는 순간 -1을 출력하게 되고, long long의 최대 값을 넘어가는 순간 가변 인자값이 들어가게 됩니다.

#include <stdio.h>

int main()
{
	// int 최대값 + 1
	printf("=== int 최대값 + 1 ===\\n");
	int a = printf("%2147483648d\\n", 123);
	printf("printf a : %d\\n", a);
	// long long 최대값 + 1
	printf("=== long long 최대값 + 1 ===\\n");
	int b = printf("%9223372036854775808d\\n", 123);
	printf("printf b : %d", b);
	return (0);
}

위 코드의 output은 다음과 같았습니다.

=== int 최대값 + 1 ===
printf a : -1
=== long long 최대값 + 1 ===
123
printf b : 4 // \\n때문에 +1이 되어 4가 출력됨.

width값을 atoi를 통해 얻어낼 생각이었지만, 위와 같은 특징 때문에 atoi를 수정해야 했습니다.

이때 atoi가 필요한 이유는, 문자열로 주어진 width길이를 int형으로 바꿔서 사용해야 하기 때문이었습니다.

while (ft_isdigit(*s))
	{
		tmp = ret * 10 + (*s++ - '0');
		if ((((1 << 31) & tmp) ^ ((1 << 31) & ret)) == 0)
			of_cnt = 1;
		ret = tmp;
	}

위와 같은 코드가 추가되었는데, overflow가 한 번 이상 발생된 경우의 체크가 필요하기 때문에 필요하기 때문에

if ((((1 << 31) & tmp) ^ ((1 << 31) & ret)) == 0)