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.MaxValue
hàm giống như C / C ++ trong java không?
int
bằng long long int
câu trả lời của Gregories ...
-pedantic
) hỗ trợ nó.
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.MaxValue
hàm giống như C / C ++ trong java không?
int
bằng long long int
câu trả lời của Gregories ...
-pedantic
) hỗ trợ nó.
Câu trả lời:
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;
min
là giá trị dương tối thiểu , trong đó số nguyên min
là giá trị tối thiểu. Tương tự với các macro / hằng số C.
uint64_t
và int64_t
, không phải của int
.
#include <limits>
và 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
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.
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()
- 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.
Đâ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);
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;
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.
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)) - 1
vì nó sẽ tràn, nhưng (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
hoạt động.