Witajcie, jak w C++ mogę sprawdzić ile bajtów zajmuje liczba w zmiennej, załóżmy że jest to np. -123.
Pozdrawiam
Witajcie, jak w C++ mogę sprawdzić ile bajtów zajmuje liczba w zmiennej, załóżmy że jest to np. -123.
Pozdrawiam
trzeba obliczyć logarytm o podstawie 2 z danej liczby :)
Z minusami sprawa ma się inaczej, bo 1 bit oznacza znak. Jeśli jest zapalony to liczba jest ujemna. Napisz dokładnie do czego to potrzebujesz.
@Tacet Ile bajtów w pamięci jest przeznaczone na tą liczbę, jak to inaczej można interpretować?
sizeof(TYP_ZMIENNEJ);
Można to interpretować na 2 sposoby, tzn ile najmniej potrzeba bitów w pamięci żeby zapisać daną liczbę np. dla 8 będzie to 4 bity), ale i tak jak zapiszesz to w int'a to zajmie tyle ile int potrafi przechować.
No właśnie, sizeof z inta zawsze daje mi 4 bajty bo tyle zajmuje mi ten typ danych.
Tu mam kod do liczenia logarytmu
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x,a;
float wynik;
cout << "podaj podstawe logarytmu" << endl;
cin >> x;
cout << "podaj liczba z ktorej ma byc liczony logarytm"<<endl;
cin >> a;
wynik = (log(x))/(log(a));
cout <<wynik;
return 0;
}
Z tym, że wynik dla -77 wychodzi ujemy.
Lukassz napisał(a):
@Tacet Ile bajtów w pamięci jest przeznaczone na tą liczbę, jak to inaczej można interpretować?
Lukassz napisał(a):
No właśnie, sizeof z inta zawsze daje mi 4 bajty bo tyle zajmuje mi ten typ danych.
Coś sam sobie przeczysz.
Lukassz napisał(a):
...
wynik = (log(x))/(log(a));
...
Z tym, że wynik dla -77 wychodzi ujemy.
Logarytm dla wartości ujemnych - nie istnieje.
Może chodzi czy o to:
char buf[65];
cout<<strlen(itoa(-123,buf,10))<<endl;
cout<<strlen(itoa(77,buf,10))<<endl;
cout<<strlen(itoa(-77,buf,10))<<endl;
Ola Nordmann napisał(a):
Z minusami sprawa ma się inaczej, bo 1 bit oznacza znak. Jeśli jest zapalony to liczba jest ujemna. Napisz dokładnie do czego to potrzebujesz.
Jak chcesz obliczyć ilość bitów potrzebną do zapisania signed to musisz robić: log
o podstawie 2 z (abs)zmienna
+1
. Jeśli zmienna jest mniejsza od 1 to musisz zanegować wszystkie bity.
Jeżeli jest potrzebna podstawa 2 to chyba szybszą metodą będzie:
int value=-123;
unsigned bits=(value<=1)+(value<0);
while(value>>=1) ++bits;
unsigned baits=(bits+7)>>3;
@Lukassz liczba w zmiennej zawsze zajmuje tyle ile sama zmienna. Komputer sam z siebie nic tu nie optymalizuje. Jak masz inta to choćbyś miał w nim 0 to zajmuje sizeof(int) bajtów.