Exista vreun cod pentru a găsi valoarea maximă a număr întreg (în mod corespunzător pentru compilator) în C/C++ ca Întreg.MaxValue funcția în java?
În C++:
#include <limits>
apoi, utilizați
int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();
std::numeric_limits
este un șablon de tip care poate fi instanțiată cu alte tipuri:
float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();
În C:
#include <limits.h>
apoi, utilizați
int imin = INT_MIN; // minimum value
int imax = INT_MAX;
sau
#include <float.h>
float fmin = FLT_MIN; // minimum positive value
double dmin = DBL_MIN; // minimum positive value
float fmax = FLT_MAX;
double dmax = DBL_MAX;
Știu că's o veche întrebare, dar poate cineva poate folosi această soluție:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
Până acum am -1 ca rezultat 'până dimensiune este un semnat int.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Ca Standard spune, bits care sunt deplasate în 1 dacă variabila este semnat și negative și 0 dacă variabila ar fi nesemnate sau semnate și pozitiv.
Ca dimensiune este semnat și negative ne-ar trece în bitul de semn, care este 1, ceea ce nu ajută prea mult, așa că am aruncat la unsigned int, forțându-la trecerea în 0 în loc, setând bitul de semn la 0 în timp ce permițându-toate celelalte biți rămân 1.
cout << size << endl; // Prints out size which is now set to maximum positive value.
Am putea folosi, de asemenea, o mască și xor dar apoi am avut să știu exact bitsize de variabila. Cu trecerea în biți față, nu ne't trebuie să știe în orice moment cati biti int are pe masina sau compiler nici nu am nevoie de include biblioteci suplimentare.
Aici este un macro-am folosi pentru a obține valoarea maximă pentru numere întregi semnate, care este independent de dimensiunea semnat de tip întreg folosit, și pentru care gcc-Woverflow câștigat't se plâng
#define SIGNED_MAX(x) (~(-1 << (sizeof(x) * 8 - 1)))
int a = SIGNED_MAX(a);
long b = SIGNED_MAX(b);
char c = SIGNED_MAX(c); /* if char is signed for this target */
short d = SIGNED_MAX(d);
long long e = SIGNED_MAX(e);
O. K. am nici rep să comenteze răspunsul anterior (de Philippe De Muyter) și nici să-l ridice's înscrie, prin urmare, un nou exemplu de folosire a lui defini pentru SIGNED_MAX trivial extins pentru nesemnate tipuri:
// We can use it to define limits based on actual compiler built-in types also:
#define INT_MAX SIGNED_MAX(int)
// based on the above, we can extend it for unsigned types also:
#define UNSIGNED_MAX(x) ( (SIGNED_MAX(x)<<1) | 1 ) // We reuse SIGNED_MAX
#define UINT_MAX UNSIGNED_MAX(unsigned int) // on ARM: 4294967295
// then we can have:
unsigned int width = UINT_MAX;
Spre deosebire de a utiliza acest lucru sau că antet, aici vom folosi tipul real de compilator.
Ce zici de (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
.
Acest lucru este la fel ca 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)
.
Dacă sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max semnat int 4 bytes]
.
Puteți't folosi 2*(1 << (8*sizeof(int)-2)) - 1
, deoarece se vor revărsa, dar (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
funcționează.