Największa liczba danego typu

0

Czy istnieje jakaś funkcja, która zwróci mi największą liczbę z danego typu?

Np. typ 'unsigned char' powinien zwrócić 255.

Coś takiego jak 'High' w Delphi?

1

prawie...
mozesz uzyc sizeof...
z tym ze w tym wypadku musisz uwazac na unsigned/signed...

wymyslilem cos takiego

#define max_signed(t)     ( ( 1 << ( sizeof( t ) * 8 - 1 ) ) - 1 )
#define max_unsigned(t)   ( ( 1 << ( sizeof( t ) * 8 ) ) - 1 )

zastosowanie jak nizej

#include<stdio.h>

#define max_signed(t)     ( ( 1 << ( sizeof( t ) * 8 - 1 ) ) - 1 )
#define max_unsigned(t)   ( ( 1 << ( sizeof( t ) * 8 ) ) - 1 )

int
main( void )
{
  printf("signed:\\n"
         "char %u\\nshort %u\\nint %u\\n\\n"
         "unsigned:\\n"
         "char %u\\nshort %u\\nint %u\\n\\n",
         max_signed(char), max_signed(short), max_signed(int),
         max_unsigned(char), max_unsigned(short), max_unsigned(int),
         );
         
  return 0;
}

ofc nie dziala to dla zadnych floatow etc, dla nich max liczba to wyzszy hightech ;>
teoretycznie max liczba (oznaczeniem moze) dla floata i doubla jest nieskonczonosc :>>>>
przejrzyj float.h

0

Dzięki za szybką odpowiedź. :)

Działa dokładnie tak jak chciałem (oczywiście dopóki nie pogubię się z signed/unsigned ;) )

0

#define max_signed(t) ( ( 1 << ( sizeof( t ) * 8 - 1 ) ) - 1 )

jak tu działa to bitowe przesunięcie (<<) i dlaczego jest tutaj uzyte, z góry dzieki za odp !

0

Dla wszystkich typów nieoznaczonych chyba najprościej pisać :

unsigned char c=(unsigned char)(-1);
unsigned int i=(unsigned int)(-1);
unsigned long a=(unsigned long)(-1);

;]

1

#define max_signed(t) ( ( 1 << ( sizeof( t ) * 8 - 1 ) ) - 1 )

jak tu działa to bitowe przesunięcie (<<) i dlaczego jest tutaj uzyte, z góry dzieki za odp !

postaram sie wytlumaczyc
wiec...
wezmy np takiego inta
sizeof(int) == 4 <=- liczba bajtow zajmowanych przez liczbe
wiec mamy:
( ( 1 << ( 48 - 1) ) - 1 )
4
8 - 1 == 31 <=- liczba bitow zajmowanych przez liczbe - 1
( ( 1 << 31 ) - 1 )
1 << 31 to bedzie
10000000000000000000000000000000b
czyli
0x80000000
a 0x80000000 to jest liczba ujemna, maxymalna dodatnia to jest min. ujemna - 1 (wg arytmetyki kompa ;pp, nie klasycznej ;ppp)
czyli
0x7FFFFFFF tyo jest max int
tak dziala...

a dlaczego jest uzyte ?
w sumie chodzilo o uzyskanie potegi liczby 2
jak wiadomo jesli typ ma np 4 bajty, to ma 32 bity
czyli ma 2 podniesione do 32 mozliwosci, czyli dokladnie tyle ile wynosi maxymalna liczba + 1...
od tego 2^32 trzeba odjac 1, poniewaz to "1" to jest "zero" ;>>>
(mamy liczby: 0,1,2,3... etc... az do 232-1, wiec mozliwosci jest 232, ale max liczba to 2^32-1)
w kazdym badz razie trzeba nam jakos podnies to 2 do potegi 32
robi sie to dosc prosto
przesuniecie bitowe w lewo jest oczywiscie zastepstwem mnozenia przez 2
czyli 22222....22 mozna zapisac jako 1<<32
od tego odejmujemy 1, i mamy max unsigned int
ale.. jesli chcemy signed, tyo musimy podzielic przez dwa
dlaczego? no przeciez polowa "miejsca" zuzywana jest na dodatnie, a polowa na ujemne liczby...
dzielenie przez dwa mozna zapisac jako przesuniecie w prawo, czyli
(1<<32)>>1
ale to jest ofc
1<<31
stad nasze 1<<(sizeof(t)*8 - 1)
nyo a potem wystarczy odjac 1, i mamy wynik
( ( 1 << ( sizeof( t ) * 8 - 1 ) ) - 1 )

mam nadzieje ze w miare zrozumiale wytlumaczylem</b>

0

innymi słowy *8 można zastąpić <<3 :D

0

i wtedy właśnie mamy ((1<<32)>>1)<<3 [green]

0
#include <limits.h>
...
printf("Najmniejszy signed char: %d\\n", SCHAR_MIN);
printf("Najwiekszy signed char: %d\\n", SCHAR_MAX);
printf("Najwiekszy unsigned char: %d\\n", UCHAR_MAX);

I tak dalej...

1 użytkowników online, w tym zalogowanych: 0, gości: 1