giá trị tối đa của int


177

Có mã nào để tìm giá trị tối đa của số nguyên (phù hợp với trình biên dịch) trong Integer.MaxValuehàm giống như C / C ++ trong java không?


1
Có cách nào để tìm giá trị tối đa của long long int không ??
d3vdpro

Chỉ cần thay thế intbằng long long intcâu trả lời của Gregories ...
Georg Fritzsche

1
ngoại trừ việc lâu dài không phải là một phần của C ++


@Neil, phải, C99 của nó - nhưng VC và GCC (không có -pedantic) hỗ trợ nó.
Georg Fritzsche

Câu trả lời:


323

Trong C ++:

#include <limits>

sau đó sử dụng

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();

std::numeric_limits là một kiểu mẫu có thể được khởi tạo với các loại khác:

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();

Trong C:

#include <limits.h>

sau đó sử dụng

int imin = INT_MIN; // minimum value
int imax = INT_MAX;

hoặc là

#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
Lưu ý rằng dấu phẩy động minlà giá trị dương tối thiểu , trong đó số nguyên minlà giá trị tối thiểu. Tương tự với các macro / hằng số C.
dalle

4
trong C99, bạn cũng có thể sử dụng UINT64_MAX và INT64_MAX
Dmitry Vyal

3
@DmitryVyal: Có, bạn có thể, nhưng đó là những giới hạn của uint64_tint64_t, không phải của int.
Keith Thompson

Trong C ++, tôi đã sử dụng cùng một mã được hiển thị ở trên: #include <limits>int imax = std::numeric_limits<int>::max();, nhưng tôi gặp lỗi Can't resolve struct member 'max'. Bất kỳ ý tưởng về lý do tại sao điều này xảy ra, và làm thế nào để khắc phục nó? Tôi đang sử dụng CLion IDE, với CMake và C ++ 11 trên Ubuntu 14.04. Tôi nghĩ rằng nó có liên quan đến vấn đề này
modulitos

1
Hy vọng rằng điều này sẽ giúp được ai đó, vì đó là lỗi CLion IDE mà tôi đã sửa bằng cách sử dụng CLion mới nhất (bản dựng 138,2344 - CLion đang trong giai đoạn Chương trình truy cập sớm, và do đó không ổn định)
modulitos

30

Tôi biết đó là một câu hỏi cũ nhưng có lẽ ai đó có thể sử dụng giải pháp này:

int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)

Cho đến nay chúng ta có -1 là kết quả 'cho đến khi kích thước là một số nguyên đã ký.

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.

Như Standard nói, các bit được dịch chuyển là 1 nếu biến được ký và âm và 0 nếu biến sẽ không được ký hoặc ký và dương.

Khi kích thước được ký và âm, chúng ta sẽ thay đổi bit dấu là 1, điều này không giúp ích gì nhiều, vì vậy chúng ta chuyển sang int unsign, thay vào đó thay đổi 0, đặt bit dấu thành 0 trong khi vẫn để tất cả các bit khác giữ nguyên 1.

cout << size << endl; // Prints out size which is now set to maximum positive value.

Chúng ta cũng có thể sử dụng mặt nạ và xor nhưng sau đó chúng ta phải biết chính xác bitize của biến. Với việc dịch chuyển các bit phía trước, chúng ta không cần phải biết bất cứ lúc nào số int có trên máy hoặc trình biên dịch cũng như không cần chúng tôi bao gồm các thư viện bổ sung.


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
Tôi sẽ không gọi INT_MAX là "giải pháp cho C". Tuy nhiên, đó là trường học cũ và không dùng nữa trong C ++.
Paul Tomblin

6
Tôi nghĩ cả hai đều là câu trả lời của C ++. numeric_limits<int>::max()- cũng hoạt động trong bối cảnh mẫu, nhưng (đối với một số lý do không thể hiểu được đối với tôi) không thể được sử dụng như một hằng số thời gian biên dịch. INT_MAX- là một macro, khá vô dụng trong các hàm mẫu, nhưng có thể được sử dụng như một hằng số thời gian biên dịch.
ChúBens

17
Điều thú vị là số_limits <int> :: triển khai tối đa trên msvc trông như thế này: return (INT_MAX);
Nikola Smil camerać

13
@paul Tham khảo cho sự phản đối xin vui lòng. Và đoán làm thế nào num_limits thực hiện max ()? Đúng vậy, "return INT_MAX", ít nhất là trên GCC 4.4.0.

2
@UncleBens: các hàm nội tuyến hiện không thể giảm thành biểu thức không đổi.
Georg Fritzsche

1

Đây là một macro tôi sử dụng để lấy giá trị tối đa cho các số nguyên đã ký, độc lập với kích thước của loại số nguyên đã ký được sử dụng và gcc -Woverflow sẽ không khiếu nại

#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

Tại sao không viết một đoạn mã như:

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

28
Không có gì đảm bảo rằng int có kích thước 32 bit và không có gì đảm bảo về định dạng số nguyên âm trong bộ nhớ. Ít quan trọng hơn, không cần phải khiến mọi người phải ngước nhìn '~'.
Sqeaky

0

OK Tôi không có ý kiến ​​để bình luận về câu trả lời trước đó (của Philippe De Muyter) cũng như không nâng cao điểm số của nó, do đó, một ví dụ mới sử dụng định nghĩa của anh ấy cho SIGNED_MAX mở rộng tầm thường cho các loại không dấu:

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

Không giống như sử dụng tiêu đề này hoặc tiêu đề đó, ở đây chúng tôi sử dụng loại thực từ trình biên dịch.


0
#include <iostrema>

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

Nó có thể phụ thuộc vào kiến ​​trúc nhưng nó hoạt động ít nhất trong thiết lập của tôi.


-1

Đối với giá trị tối đa cụ thể của int , tôi thường viết ký hiệu thập lục phân:

int my_max_int = 0x7fffffff;

thay vì giá trị thập phân không đều:

int my_max_int = 2147483647;

-1

Những gì về (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2)). Điều này giống như 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2).

Nếu 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].

Bạn không thể sử dụng 2*(1 << (8*sizeof(int)-2)) - 1vì nó sẽ tràn, nhưng (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.