Search
Duplicate

ft_printf

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); }
C
복사
위 코드의 output은 다음과 같았습니다.
=== int 최대값 + 1 === printf a : -1 === long long 최대값 + 1 === 123 printf b : 4 // \n때문에 +1이 되어 4가 출력됨.
C
복사
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; }
C
복사
위와 같은 코드가 추가되었는데, overflow가 한 번 이상 발생된 경우의 체크가 필요하기 때문에 필요하기 때문에
if ((((1 << 31) & tmp) ^ ((1 << 31) & ret)) == 0)
C
복사
를 추가하게 되었습니다. 그 이후에도 ret의 값이 업데이트 되는데, 그 이유는 long long의 최대값을 넘어선 경우에는 오버플로우가 난 것을 그대로 둔 채로 ret 변수에 저장된 값을 이용해야 하기 때문입니다.
1. 한 번도 오버플로우가 나지 않은 경우
→ ret return
2. 한 번이라도 오버플로우가 난 경우
→ 2_1. ret가 int의 최대값 보다 크면 -1 return
→ 2_2. 그렇지 않다면 0 return