maksimum int değeri


177

Integer.MaxValueJava C / C ++ benzeri fonksiyonunda tamsayı (derleyiciye göre) maksimum değerini bulmak için herhangi bir kod var mı ?


1
uzun uzun int maksimum değerini bulmak için herhangi bir yolu var mı ??
d3vdpro

Sadece Gregories cevabı intile değiştirin long long int...
Georg Fritzsche

1
ancak uzun uzun C ++ parçası değildir


@Neil, doğru, C99'u - ancak VC ve GCC (olmadan -pedantic) destekliyor.
Georg Fritzsche

Yanıtlar:


323

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;

13
Kayan noktanın minminimum pozitif değer olduğunu unutmayın; burada tamsayı minminimum değerdir. Aynı şey C makroları / sabitleri için de geçerlidir.
dalle

4
C99'da ayrıca UINT64_MAX ve INT64_MAX kullanabilirsiniz
Dmitry

3
@DmitryVyal: Evet yapabilirsiniz, ancak bunlar sınırlıdır uint64_tve int64_tdeğil int.
Keith Thompson

C ++, yukarıda gösterilen aynı kodu kullandım: #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
modulitos

1
Umarım bu birine yardımcı olur, çünkü en son CLion'ı kullanarak sabitlediğim bir CLion IDE hatasıydı (138.2344 - CLion Erken Erişim Programı aşamasındadır ve bu nedenle kararsızdır)
modulitos

30

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.


1
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
Slaiyer

15
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}

1
INT_MAX "C için bir çözüm" demezdim. Yine de eski okul ve C ++ 'da kullanımdan kaldırıldı.
Paul Tomblin

6
Bence her ikisi de C ++ cevapları. 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.
UncleBens

17
Komik olan şudur: msvc'deki numeric_limits <int> :: max uygulaması şöyle görünür: return (INT_MAX);
Nikola Smiljanić

13
@paul Kullanımdan kaldırılma referansı lütfen. Ve tahmin et numeric_limits max () 'ı nasıl uygular? Bu doğru, "dönüş INT_MAX", en azından GCC 4.4.0'da.

2
@ UncleBens: satır içi işlevler şu anda sabit ifadelere indirgenemez.
Georg Fritzsche

1

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);

1

Neden bir kod parçası yazmıyorsunuz:

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;

28
İnt'in 32 bit büyüklüğünde olduğu ve bellek negatif tamsayı biçiminde bir garantisi yoktur. Daha az önemlisi, insanların '~' görünmesini sağlamaya gerek yoktur.
Sqeaky

0

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.


0
#include <iostrema>

int main(){
    int32_t maxSigned = -1U >> 1;
    cout << maxSigned << '\n';
    return 0;
}

Mimariye bağlı olabilir, ancak en azından kurulumumda çalışıyor.


-1

Spesifik maksimum değerden için int , genellikle altılı gösterimi yazın:

int my_max_int = 0x7fffffff;

düzensiz ondalık değer yerine:

int my_max_int = 2147483647;

-1

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)) - 1o ama taşar çünkü (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))işleri.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.