인프런 커뮤니티 질문&답변

m1n_q님의 프로필 이미지
m1n_q

작성한 질문수

홍정모의 따라하며 배우는 C언어

4.8 변환 지정자의 수식어들

%lld 형식지정자 질문 드립니다!

작성

·

1.2K

0

%lld 가 long long int의 자료형을 받을 수 있는 형식 지정자로 기억하는데,

long long int는  8바이트 = 64비트의 사이즈를 가지니

signed의 경우 2^63인 9223372036854775807 까지 표현이 되어야하는 것으로 이해하고 있습니다.

허나 강의 내용 마지막에서 x86 환경 %lld 에서 INT_MAX + 1 을 출력했을때 오버플로우가 발생하는 이유를 알고 싶습니다!

32비트 환경에서는 64비트 크기인 long long int 자체가 지원이 안되고,

32비트의 모든 자료형의 최대 크기가 32비트로 제한이 되는건가요?

이해에 도움을 주시면 감사하겠습니다!

답변 5

1

저도 정확한 이유는 잘 모르겠지만 그런 것 같습니다.

답변에서 제가 실험해본 것 처럼 굳이 IN_MAX + 1 같은 큰 값 아니더라도 3 과 같은 평범한 int 정수를 lld 형식으로 출력했을 때도 3이 아닌 이상하고 랜덤한 값이 출력되었기 때문입니다. 그런것으로 보아 32bit 수를 64bit 형식으로 출력하는 행위가 32bit 시스템에선 불완전한가봐요!

3과 같은 int가 아닌, long long인 3LL 을 lld 형식으로 출력할 땐 문제가 없었습니다. 그런 것으로 보아 32bit 환경에서 64비트를 출력할땐 신경써서  lld에 맞춰 3LL을 넘겨주는 이런식으로 형식지정자와 크기를 맞춰주는 것이 안전할 것 같습니다.

32비트 환경에서 64비트의 출력 하려면 입력 수도 3LL 이렇게 똑같은 64비트를 넘겨주어 이를 64비트로 출력하게끔 크기만 동일하게 맞춰주면 괜찮은 것 같아요.

32 bit 환경에서 32bit를(3) 64bit(%lld)로 출력하게 하기 👉 불완전. 제대로된 결과 X

32 bit 환경에서 64bit를(3LL) 64bit(%lld)로 출력하게 하기 👉 문제없음!

0

86하고 .....64 하고.....

lld같은 경우는 출력값이 다른가 봐요 ....

lld같은 큰수를 다룰때에는 64를써야할듯여 ...

여하튼 lld를 사용할때에는 ....조심해야할듯여.....~

0

m1n_q님의 프로필 이미지
m1n_q
질문자

학습에 도움이 되었습니다 감사합니다!!!!

0

m1n_q님의 프로필 이미지
m1n_q
질문자

친절한 답변 정말 감사드립니다! 그렇다면 , 개념적으로는 lld의 범위가 위와 같고, INT_MAX+1 도 그 범위안에 포함이 되나,

32비트 환경에서 64비트의 출력 자체가 안전하지 않기 때문이란 말씀이신가요? 

0

안녕하세요!

질문자님께서 바로 아래에도 질문 남겨주셨던데 제가 그 질문글에 답변 이미 드렸습니다. 그 답변을 먼저 보시고 읽어주세요!

1.  INT_MAX + 1을 %d로 출력햇을때 다시 음수인 -2147483637 로 돌아가는 오버플로우가 발생하는 것은 맞는데 x86 환경에서 %lld 즉 8byte 의 정수 형식으로 INT_MAX + 1 을 출력하면 실행할 때마다 랜덤한 값이 출력되었습니다. 아래는 제가 실행해본 결과들입니다.

이런식으로 x86환경에서

INT_MAX + 1을 %d 형식으로 출력했을 땐 오버플로우로 인하여 -2147483637 가 고정적으로 출력됐음에도 불구하고

%lld 형식으로 출력했을 땐 실행할 때마다 랜덤한 값이 나왔습니다. 오버플로우가 발생하면  -2147483637처럼 순환하듯 가장 최저값으로 넘어가버리는데 오버플로우라기엔 랜덤하고 이상한(?)값이 출력이 되네요.. 

심지어 INT_MAX +1 이런 큰 값이 아닌 그냥 평범하고 작은 값인 3 을 %lld 로 출력했을 뿐인데도 이상한 값이 나왔습니다. 위와 같은 현상들로 보아 오버플로우는 아니고 32bit 환경에선 32bit인 int 정수를 한번에 64bit 형식으로 출력하는 것 자체가 불완전한 행위인 것으로 보여집니다. 

처음부터 64bit 크기인 3LL 을 %lld 로 출력할 땐 문제없이 3이 잘 출력 된 것을 확인할 수 있네요.

저도 왜 위와같은 현상들이 일어나는지에 대한 정확한 원인은 잘 모르겠습니다만 한번에 최대 32bit까지 표현이 가능한 환경에서 32bit를 64bit형식으로 변환해 출력하려는 시도는 랜덤하고 불완전한 결과를 일으키는 것 같다고 개인적으로 추측해봅니다. 

32bit 환경에서 64bit 자료형을 다룰땐 위 경고 문구처럼 크기를 일치시켜주는 것이 안전하고 좋을 것 같습니다.

2. 제한되지 않습니다. 32bit 환경에서도 long long int 사용하실 수 있습니다. 이와 비롯한 8byte 자료형들 사용가능합니다. 이 이유에 대해서는 이전 질문글에서 설명 드렸습니다!

m1n_q님의 프로필 이미지
m1n_q

작성한 질문수

질문하기