C에서 double에 64비트 값을 넣는법에 대한 질문~
안녕하세요.. 여기저기에서 고수가 많다는 소문을 듣고 찾아와서
첫 질문을 올립니다.
문제는 다름이 아니라 double 자료형에 대해서 인데요..
업무도중 64비트 값을 넣기 위해 8바이트 자료형인 double에
가능하지 않을까 하는 생각을 하고 시도를 해보았습니다.
업무환경은 AIX 환경에 32비트 컴파일을 하고 있습니다.
64비트 자료형으로 제가 찾아본것은 __int64(VC++), int64,
sqlint64(int64를 결국 Define 한것), long long
모두다 sizeof() 를 하였더니 8바이트로 나오더군요..
근데 문제는 32비트의 한계인 2147483648 값에 1을 더한 값을 넣었더니..
역시나 다들 오버 플로우가 발생했습니다.
그건 결국 일반 4byte int와 다를 것이 없더군요.
그래서 이번에는 double에 넣어봤습니다.
double 에 넣었더니.. unsigned int 값 까지만 들어 가는 겁니다
딱 2배까지만요.. 게다가 출력시에는 기본 소수자리까지 나오죠..
제가 생각하기에는 기본 소수자리를 넣지 않고 그 부분을 정수로 해서 하면 될것 같은데요 ㅎㅎ
결론을 이야기 하자면...
64비트 값을 넣을수 있는 즉 2147483648 보다 큰값을 넣을 수 잇는 방법 또는, (2의 63인 9,223,372,036,854,775,808 값이겠죠?)
double 에서 8바이트를 실수를 포함하지 않는 정수만 넣을 수 잇는 방법이 있는지
아시는 분 있으면 답변 부탁드립니다 ^^
어떻게 확인 하셨죠?[code:1]int main(
어떻게 확인 하셨죠?
이렇게 확인해 보세요..
참고로 Visual C에서는
입니다.
[quote="seoleda"][code:1]int main(
이 코드도 오류가 있는데요.
big_number=2147483648+10;
여기서 2147483648 는 int 입니다. 10 역시 int 입니다.
그럼 계산 결과 역시 int 이고 결과값 int 를 long long int 에 대입할 뿐이지요. 결국 원하는 값이 안나옵니다.
이건
big_number=2147483648LL+10LL;
이렇게 하거나
big_number=2147483648LL+10;
혹은
big_number=2147483648+10LL;
이렇게 하셔야 겠네요.
이렇게 해결봣습니다.
int main (int argc, char *argv[])
{
long long i = 9147483648ll;
printf ("long long i = %lld\n", i);
return 0;
}
해답 주신분들 감사해요..
넣는 Right value 의 값도 결국은 4바이트라는 한계가 있군요..
그걸 생각 못했는데.. 오른쪽 값 역시 ll 로 하면 되는군요 ㅎㅎ
감사합니다 ^^
[quote="ssehoony"]여기서 2147483648 는 int 입
그렇지 않습니다. 정수형 상수(integer literal)의 형은 그보다 좀 복잡합니다.
2147483648가 INT_MAX와 LONG_MAX보다 큰 환경에서는 long long int의
형을 갖습니다. 그러니까 int, long int, long lont int 순으로 표현 가능한 형으로
결정되는 것이죠. 따라서 2147483648+10의 연산에서 수행되는 내용은
1. long long int + int
2. 두번째 피연산자의 형이 long long int로 승격(promotion)
3. 연산 결과의 형은 long long int
4. 이 결과를 long long int형의 변수에 대입
따라서 적법한 코드이고 의도대로 수행됩니다.
물론 LL suffix를 붙이는 편이 명확하다는 장점은 있습니다.
[quote="doldori"]2147483648가 INT_MAX와
gcc 에서는 위와 같은 결과를 보이고, msc(vs .net 2003) 에서는 문제가 있네요.
위의 이야기는 gcc 의 이야기 인가요? 아니면 C의 표준안 인가요?
만약 표준이라면 msc 는 표준을 소화해 내지 못 하고 있는 듯 하군요.
[quote="ssehoony"][quote="doldori"]214
C99입니다.
네, .NET 7.1까지는 C99를 지원하지 않습니다. (8.0 beta는 어떤지 모릅니다.)
gcc는 일부 지원하고요.
아, 지금 확인해 보니 .NET에서는 위에서 seoleda님이 말씀하신 대로 I64라는
서식을 확장 기능으로 제공하는군요. 출력은 제대로 하네요.
댓글 달기