C++에서 64bit 정수형 데이터를 다뤄야 되는데요.

kknd345의 이미지

C++에서 64bit 정수형 데이터를 다뤄야 되는데요.
C++에서 제공해주는 거 말고 직접 만들어야 합니다. ㅜㅜ...
(Class 로 구현해야되요..... 덧셈 뺄셈 나눗셈 곱셈 구현....)

보통 비주얼 c++에서 int 형(= long int) 는 4byte 즉 32bit이잖아요

현재 필요한건 64bit 즉 8byte 정수형 데이터 처리인데요.

처음에 string으로 할까 생각 했는데
그럴 경우 곱셈이랑 나눗셈에 대한 각이 안 나와서....

지금은 int highNumber,lowNumber 이런식으로 할려고 하는데요. 그런데 이것도 막상 데이터 처리가 매우 까다롭네요. 곱셈 나눗셈을 어떻게 처리해야 될지도 막막하고요.

특히 오버플로우 문제에 대한 해결 방안이 떠오르지가 않습니다.
처음에는 오버플로우 할때 갑자기 부호가 바뀌면 오버플로우 처리하면 되겠다 싶었는데.... 오버플로우해서 다시 양일경우도 있고 하니 ㅡㅡ....

도저히 알고리즘이 떠오르지가 않네요....

보통 이런경우 해결방안( 알고리즘) 이 어떻게 되나요?

blee의 이미지

#include <stdio.h>
#include <asm/types.h>

int main()
{
__s64 i;
int j;

i = 0x7fffffffffffffff;
printf("%f, %d\n", (float)i, sizeof(i));

i = 0x8000000000000001;
printf("%f, %d\n", (float)i, sizeof(i));
}

sozu의 이미지

long long 을 사용하시면 됩니다.

format 에서는 %ll 입니다.

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

익명 사용자의 이미지

과제라 64bit 자료형을 쓰면 안됩니다.ㅜㅜ....

익명 사용자의 이미지

2진법 연산을 직접 수행하면 ... 될까요?

kkb110의 이미지

밑분들 말씀처럼

곱셈같은경우에는 16bit로 나눠서 하는 방법이 최선인것같군요

더하기나 빼기같은경우로는 다른 트릭이 있습니다

unsigned int a,b,c;

a = 어떤수1;

b = 어떤수2;

c = a + b;

if ((unsigned)a > (unsigned)c)
{
         //오버플로우 일어남
}
else
{
        //오버플로우 안 일어남
}

제가 잘못적었네요

unsigned int의경우 이렇게 판독가능합니다.

espereto의 이미지

64bit 형 자료형을 쓰지 못하는 조건에서 쉽게 하려면, 비트가 좀 낭비되지만, 10진수 1자리마다 4비트씩 할당하는 방법도 있습니다. (즉, BCD 코드 사용)

그렇게되면, 64bit는 20자리(signed라면 19자리)이므로, 10바이트가 필요하군요.

오버플로우 처리도 꽤 쉽게 할 수 있겠습니다. 각 자리마다 10이상의 수를 표현하는 게 가능하니까, 10 이상이면 오버플로우 처리하면서 상위 자리에 더하고 더하고 더하고......

10진법 산술 연산의 개념을 무리없이 사용할 수 있습니다. 4bit 단위로 딱 딱 끊어서 10진법이 표현되니까요.

Necromancer의 이미지

32비트 이상을 판별할 수 없으므로
32비트 자리 2개로 나누는 것보다 16비트 4자리로 나누는 것을 추천합니다.
그리고 각각의 16비트들은 32비트 변수에 들어 있어야 합니다. 그래야
오버플로우 판단하는데도 용이하고, 곱셈에도 응용할 수 있기 때문입니다.

산수시간에는 각 자리별로 0-9까지의 수를 가지고 계산했지만 이 경우는
한 자리가 16비트(0-65535)인 4자리 수로 보고, 초등학교 산수시간에
배운 내용을 응용하면 사칙연산이 됩니다.

덧셈이나 뺄샘시 16비트 넘어가는 부분이 발견되면 윗자리로 자리올림이나
빌림을 하면 되고, 곱셈은... 자리별로 다 곱한 뒤에 더하면 됩니다.

Written By the Black Knight of Destruction

kknd345의 이미지

int 형을 사용하여 4자리(10진수)씩 끊어서 계산하니

곱셈까진 생각보다 쉽게 구현이 되네요.

그런데 문제는 나눗셈이네요.
곱셈이야 밑에서부터 곱해서 상위 자릿수를 나타내는 int 에 올려주면 된다지만...

나눗셈은 따로해서 어떻게 할 노릇이 없네요. 제가 생각을 못 해내서인지....

방법 없을까요?

현재 int number[5] 개 해서
한 인트에 4자리(10진수) 총 20자리까지 나타내고 있습니다.

1%의 가능성이면 충분하다!
최선을 다하자!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.