ค่าสูงสุดของ int


177

มีรหัสใดในการค้นหาค่าสูงสุดของจำนวนเต็ม (ตามคอมไพเลอร์) ใน C / C ++ เช่นInteger.MaxValueฟังก์ชั่นใน java?


1
มีวิธีการหาค่าสูงสุดของ long long int หรือไม่?
d3vdpro

เพียงแทนที่intด้วยlong long intในคำตอบ Gregories ...
เฟรดริก Fritzsche

1
ยกเว้นความยาวนั้นไม่ได้เป็นส่วนหนึ่งของ C ++


@ Neil ถูกต้อง C99 ของมัน - แต่ VC และ GCC (ไม่รวม-pedantic) สนับสนุน
Georg Fritzsche

คำตอบ:


323

ใน C ++:

#include <limits>

จากนั้นใช้

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

std::numeric_limits เป็นประเภทเทมเพลตที่สามารถสร้างอินสแตนซ์กับประเภทอื่นได้:

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

ใน C:

#include <limits.h>

จากนั้นใช้

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

หรือ

#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
โปรดทราบว่าทศนิยมminเป็นค่าบวกขั้นต่ำที่เป็นจำนวนเต็มminเป็นค่าต่ำสุด กันไปสำหรับ C แมโคร / ค่าคงที่
dalle

4
ใน C99 คุณสามารถใช้ UINT64_MAX และ INT64_MAX ได้
Dmitry Vyal

3
@DmitryVyal: ใช่คุณสามารถ แต่ผู้ที่มีข้อ จำกัด ของuint64_tและไม่ได้ของint64_t int
Keith Thompson

ใน C ++ ผมใช้รหัสเดียวกันที่แสดงข้างต้น: #include <limits>และแต่ฉันได้รับข้อผิดพลาดint imax = std::numeric_limits<int>::max(); Can't resolve struct member 'max'มีความคิดเห็นเกี่ยวกับสาเหตุที่เกิดขึ้นและวิธีแก้ไขอย่างไร ฉันใช้ CLion IDE, กับ CMake และ C ++ 11 บน Ubuntu 14.04 ฉันคิดว่ามันเชื่อมโยงกับปัญหานี้
modulitos

1
หวังว่านี่จะช่วยให้ใครบางคนเพราะมันเป็นข้อผิดพลาดของ CLion IDE ที่ฉันแก้ไขโดยใช้ CLion ล่าสุด (สร้าง 138.2344 - CLion อยู่ในขั้นตอนของโปรแกรมการเข้าถึงก่อนและไม่เสถียร)
modulitos

30

ฉันรู้ว่ามันเป็นคำถามเก่า แต่บางทีใครบางคนสามารถใช้โซลูชันนี้:

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

จนถึงตอนนี้เรามี -1 เนื่องจากผลลัพธ์ 'จนถึงขนาดเป็น int ที่มีการเซ็นชื่อ

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

ตามที่ระบุในมาตรฐานบิตที่เลื่อนในคือ 1 ถ้าตัวแปรถูกเซ็นชื่อและลบและ 0 ถ้าตัวแปรจะไม่ได้ลงนามหรือลงนามและเป็นบวก

เมื่อขนาดมีการลงนามและลบเราจะเปลี่ยนบิตสัญญาณซึ่งเป็น 1 ซึ่งไม่ได้ช่วยอะไรมากเราจึงเปลี่ยนเป็น int ที่ไม่ได้ลงชื่อบังคับให้เปลี่ยนเป็น 0 แทนตั้งค่าบิตเป็น 0 ในขณะที่ปล่อยบิตอื่น ๆ ทั้งหมดยังคงอยู่ 1

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

เราสามารถใช้ mask และ xor ได้ แต่จากนั้นเราต้องรู้บิตของตัวแปรที่แน่นอน ด้วยการเลื่อนบิตเป็นบิตเราไม่จำเป็นต้องรู้ว่าเมื่อใดที่จำนวนบิตที่ int มีบนเครื่องหรือคอมไพเลอร์และไม่ต้องการให้เรารวมไลบรารีเพิ่มเติม


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" มันเป็นโรงเรียนเก่าและเลิกใน C ++
พอลทอมบลิน

6
ฉันคิดว่าทั้งคู่เป็นคำตอบ C ++ numeric_limits<int>::max()- ทำงานในบริบทเทมเพลต แต่ (สำหรับเหตุผลที่คาดเดาไม่ได้สำหรับฉัน) ไม่สามารถใช้เป็นค่าคงที่เวลารวบรวมได้ INT_MAX- เป็นมาโครไร้ประโยชน์ในฟังก์ชันเทมเพลต แต่สามารถใช้เป็นค่าคงที่เวลาการคอมไพล์ได้
UncleBens

17
สิ่งที่ตลกคือ numeric_limits <int> :: การใช้งานสูงสุดบน msvc มีลักษณะดังนี้: return (INT_MAX);
Nikola Smiljanić

13
@paul การอ้างอิงสำหรับการคัดค้านกรุณา และเดาว่า numeric_limits ใช้ max () ได้อย่างไร ถูกต้องแล้ว "return INT_MAX" อย่างน้อยใน GCC 4.4.0

2
@ UncleBens: ฟังก์ชั่นแบบอินไลน์ไม่สามารถลดให้เป็นนิพจน์คงที่ได้
Georg Fritzsche

1

นี่คือมาโครที่ฉันใช้เพื่อรับค่าสูงสุดสำหรับจำนวนเต็มที่ลงนามซึ่งไม่ขึ้นอยู่กับขนาดของประเภทจำนวนเต็มที่ลงนามแล้วและ gcc -Woverflow จะไม่บ่น

#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

ทำไมไม่เขียนโค้ดเช่น:

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

28
ไม่มีการรับประกันว่า int มีขนาด 32 บิตและไม่มีการรับประกันเกี่ยวกับรูปแบบจำนวนเต็มลบในหน่วยความจำ ที่สำคัญน้อยกว่าไม่จำเป็นต้องทำให้ผู้คนค้นหา '~'
Sqeaky

0

ตกลงฉันไม่มีตัวแทนแสดงความคิดเห็นกับคำตอบก่อนหน้า (ของ Philippe De Muyter) หรือเพิ่มคะแนนดังนั้นจึงเป็นตัวอย่างใหม่โดยใช้คำจำกัดความของเขาสำหรับ SIGNED_MAX ที่ขยายออกเล็กน้อยสำหรับประเภทที่ไม่ได้ลงชื่อ:

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

ซึ่งแตกต่างจากการใช้ส่วนหัวนี้หรือที่นี่เราใช้จริงจากคอมไพเลอร์


0
#include <iostrema>

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

มันอาจจะขึ้นอยู่กับสถาปัตยกรรม แต่มันทำงานอย่างน้อยในการตั้งค่าของฉัน


-1

สำหรับค่าสูงสุดเฉพาะของintฉันมักจะเขียนสัญลักษณ์เลขฐานสิบหก:

int my_max_int = 0x7fffffff;

แทนค่าทศนิยมผิดปกติ:

int my_max_int = 2147483647;

-1

(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))สิ่งที่เกี่ยวกับ 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)นี้เป็นเช่นเดียวกับ

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]ถ้า

คุณไม่สามารถใช้2*(1 << (8*sizeof(int)-2)) - 1เพราะมันจะล้น แต่ใช้(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.