Integer.MaxValue
Java C / C ++ benzeri fonksiyonunda tamsayı (derleyiciye göre) maksimum değerini bulmak için herhangi bir kod var mı ?
int
ile değiştirin long long int
...
-pedantic
) destekliyor.
Integer.MaxValue
Java C / C ++ benzeri fonksiyonunda tamsayı (derleyiciye göre) maksimum değerini bulmak için herhangi bir kod var mı ?
int
ile değiştirin long long int
...
-pedantic
) destekliyor.
Yanıtlar:
C ++ dilinde:
#include <limits>
sonra kullan
int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();
std::numeric_limits
diğer türlerle başlatılabilen bir şablon türüdür:
float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();
C dilinde:
#include <limits.h>
sonra kullan
int imin = INT_MIN; // minimum value
int imax = INT_MAX;
veya
#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;
min
minimum pozitif değer olduğunu unutmayın; burada tamsayı min
minimum değerdir. Aynı şey C makroları / sabitleri için de geçerlidir.
uint64_t
ve int64_t
değil int
.
#include <limits>
ve int imax = std::numeric_limits<int>::max();
, ama hatayı alıyorum Can't resolve struct member 'max'
. Bunun neden oluştuğuna ve nasıl düzeltileceğine dair herhangi bir fikir var mı? Ubuntu 14.04 üzerinde CMake ve C ++ 11 ile CLion IDE kullanıyorum. Ben bu konuyla
Eski bir soru olduğunu biliyorum ama belki birisi bu çözümü kullanabilir:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
Şimdiye kadar var -1 kadar' sonucu boyutu imzalı int.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Standard'ın dediği gibi, kaydırılan bitler değişken imzalanırsa 1, negatif ve değişken imzalanmamış veya imzalanırsa ve pozitif olur.
As boyutu imzalanır ve işaretsiz int döküm yüzden izin verirken negatif biz 0'a işaret biti ayarlayarak, 0 yerine kaymaya zorlayarak, çok yardımcı olmuyor 1 olduğu işaret biti de kayacaktır diğer tüm bitleri 1 kalır.
cout << size << endl; // Prints out size which is now set to maximum positive value.
Bir maske ve xor da kullanabiliriz, ancak değişkenin tam bit boyutunu bilmek zorundaydık. Uçların önünde kayma ile, int'in makinede veya derleyicide kaç bit olduğunu bilmek zorunda değiliz veya ekstra kitaplık eklememiz gerekmiyor.
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
numeric_limits<int>::max()
- şablon bağlamlarında da çalışır, ancak (benim için anlaşılmaz bir nedenden dolayı) derleme zamanı sabiti olarak kullanılamaz. INT_MAX
- şablon işlevleri içinde oldukça işe yaramaz bir makrodur, ancak derleme zamanı sabiti olarak kullanılabilir.
Burada, kullanılan işaretli tamsayı türünün boyutundan bağımsız olan ve gcc -Woverflow'un şikayet etmeyeceği işaretli tamsayılar için maksimum değeri elde etmek için kullandığım bir makro var
#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);
Neden bir kod parçası yazmıyorsunuz:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
Tamam Ben ne önceki cevap (Philippe De Muyter) hakkında yorum yapmak ne de puanını artırmak için temsilcisi var, bu nedenle imzasız türleri için önemsizce uzatılmış SIGNED_MAX için onun tanımını kullanarak yeni bir örnek :
// 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;
Bu veya bu üstbilgiyi kullanmanın aksine, burada derleyiciden gerçek türü kullanıyoruz.
Ne olmuş (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
. Bu ile aynı 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)
.
Eğer sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes]
.
Sen kullanamazsınız 2*(1 << (8*sizeof(int)-2)) - 1
o ama taşar çünkü (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
işleri.