Apakah ada kode untuk mencari nilai maksimal dari bilangan bulat (sesuai dengan compiler) pada C/C++ seperti Integer.MaxValue
fungsi di jawa?
Dalam C++:
#include <limits>
kemudian gunakan
int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();
std::numeric_limits
adalah jenis template yang dapat diturunkan dengan jenis lain:
float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();
Di C:
#include <limits.h>
kemudian gunakan
int imin = INT_MIN; // minimum value
int imax = INT_MAX;
atau
#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;
Aku tahu itu's sebuah pertanyaan lama tapi mungkin seseorang dapat menggunakan solusi ini:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
Sejauh ini kita telah -1 sebagai hasil 'sampai ukuran adalah signed int.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Sebagai Standar mengatakan, bit yang digeser adalah 1 jika variabel ditandatangani dan negatif dan 0 jika variabel yang akan ditandatangani atau tidak ditandatangani dan positif.
Sebagai ukuran ditandatangani dan negatif kita akan bergeser di sign bit yang 1, yang tidak membantu banyak, jadi kita cor ke unsigned int, memaksa untuk pergeseran 0 sebaliknya, pengaturan sign bit 0 sementara membiarkan semua bit lainnya tetap 1.
cout << size << endl; // Prints out size which is now set to maximum positive value.
Kita juga bisa menggunakan masker dan xor tapi kemudian kita harus tahu persis bitsize variabel. Dengan pergeseran bit depan, kita don't harus mengetahui setiap saat berapa banyak bit int pada mesin atau compiler juga perlu kita termasuk tambahan perpustakaan.
Berikut ini adalah macro yang saya gunakan untuk mendapatkan nilai maksimum untuk menandatangani bilangan bulat, yang independen dari ukuran ditandatangani tipe integer digunakan, dan untuk yang gcc -Woverflow won't mengeluh
#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. I tidak memiliki rep untuk komentar di jawaban sebelumnya (Philippe De Muyter) atau menaikkan itu's skor, oleh karena itu baru contoh menggunakan nya mendefinisikan untuk SIGNED_MAX sepele diperpanjang untuk unsigned jenis:
// 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;
Tidak seperti menggunakan ini atau itu header, di sini kita menggunakan jenis nyata dari compiler.
Bagaimana (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
.
Ini adalah sama seperti 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)
.
Jika sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int 4 bytes]
.
Anda dapat't menggunakan 2*(1 << (8*sizeof(int)-2)) - 1
karena itu akan meluap, tapi (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
bekerja.