W jakim typie zapisać olbrzymie liczby?

dział ogólny

W jakim typie zapisać olbrzymie liczby?

Nowy postprzez lidamian » czwartek, 15 stycznia 2009, 19:14

Mamy 4 zmienne zawierające pojemność jakiegoś dysku HDD:
Kod: Zaznacz cały
int GB = 10;
int MB = 1023;
int KB = 300;
int B =  800;

Chciałbym wyświetlić w labelu łączną ilość bajtów tego dysku (na podstawie danych zmiennych).

Próbowałem czegoś takiego:
Kod: Zaznacz cały
unsigned __int64 __fastcall TFrm_Taby::GetSimulateSize()
{
  unsigned __int64 Size = 0;
  int GB = 3;
  int MB = 1023;
  int KB = 1023;
  int B =  1023;

  Size = GB * 1024*1024*1024; // bo 1 GB = (1024*1024*1024) bajtów
  Size += MB * 1024*1024;
  Size += KB * 1024;
  Size += B;
  return Size;
}

ale to działa do zakresu 4 GB a dalej już nie ponieważ typ unsigned __int64 nie potrafi przechować większych liczb (niż 4 GB w bajtach) ;/

Więc jak wyświetlić większe liczby niż 64 bitowe? Albo jak to rozwiązać innym sposobem?
Avatar użytkownika
lidamian
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): piątek, 19 września 2008, 15:25
Podziękował : 4
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: W jakim typie zapisać olbrzymie liczby?

Nowy postprzez polymorphism » czwartek, 15 stycznia 2009, 19:45

Jak to nie potrafi? :? Przecież maksymalna wartość unsigned __int64 to TeX: 2^{64} - 1 = 18446744073709551615 :!:

Problem za pewne leży w tym, że mnożenie wykonujesz na int'ach. Zamień je na unsigned __int64.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: W jakim typie zapisać olbrzymie liczby?

Nowy postprzez Cyfrowy Baron » czwartek, 15 stycznia 2009, 19:55

Dokładnie! Jeżeli wynik ma być w __int64 (gdyż Tobie wystarczy __int64) to działąnia muszą być wykonywane na takich liczbach.

Czyli może to wyglądać tak:

Kod: Zaznacz cały
  __int64 Size = 0;
  int GB = 3;
  int MB = 1023;
  int KB = 1023;
  int B =  1023;

  Size = GB * 1024i64*1024i64*1024i64; // bo 1 GB = (1024*1024*1024) bajtów
  Size += MB * 1024i64*1024i64;
  Size += KB * 1024i64;
  Size += (__int64)B;
  return =  Size;


zwracam uwagę na i64 to znaczy, że użyta liczba jest liczbą 64 bitową. Możesz oczywiście równie dobrze zdefiniować liczby typu __int64:

Kod: Zaznacz cały
  __int64 Size = 0;
  __int64 GB = 3;
  __int64 MB = 1023;
  __int64 KB = 1023;
  __int64 B =  1023;

  Size = GB * 1024*1024*1024; // bo 1 GB = (1024*1024*1024) bajtów
  Size += MB * 1024*1024;
  Size += KB * 1024;
  Size += B;
  return Size;


__int64 = 12345654321i64
unsigned __int64 = 1234567887654321
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości