1. 程式人生 > >C語言中,int的最大值與最小值:

C語言中,int的最大值與最小值:

1. 有符號數:

         分析:計算機中有符號整數是用補碼錶示的。

         對於有符號的n位二進位制數的其取值範圍為:最小值:-2^(n-1);  最大值:2^(n-1) -1;

2.無符號數:

對於無符號的n位二進位制數的其取值範圍為:

    最小值:0;  //(所有的位全0)

    最大值:2^n    - 1; //所有的位全為1;

更多補充:

在C/C++程式設計中時常需要使用整數的最大值最小值,通常這兩個常用是跟平臺和作業系統有關的,不同的平臺會有不同的值,因此可移植的辦法就是推薦使用庫函式提供的常量定義。

(1)類似的常量定義在limits.h和float.h標頭檔案中,可以檢視原始檔獲取類似常量的使用辦法。在標頭檔案中,整數的最值通常是這樣的名字:INT_MAX, INT_MIN,直接使用即可。

(2)當然這兩個最值完全可以通過程式設計實現:

#define MAX_INT ((unsigned)(-1)>>1)

#define MIN_INT (~MAX_INT)

但是,這兩個巨集僅僅是沒有型別的符號,在使用的時候會陷入困境。看下面這段C++程式,輸出結果出乎意料。

#include <iostream>
#include <limits>
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)

int main()
{
    std::cout << "max_int: " << MAX_INT << "\n"
        << "min_int: " << MIN_INT << std::endl;
}
輸出結果是

問題出在:輸出MIN_INT,由於MIN_INT僅僅是個符號,在輸出給cout時就按照Cpp的規則以長整數輸出了,因此正確的辦法是

   cout << "max_int: " << (int)MAX_INT << "\n"
        << "min_int: " << (int)MIN_INT << endl;

當然最好的辦法還是不要使用#define這個巨集,不安全。

(3)因此,一個比較好的解決辦法是,直接定義變數

int MAX_INT = ((unsigned)(-1))>>1;

int MIN_INT = ~MAX_INT;

程式碼如下:

#include <stdio.h>
int main()
{
    int MAX_INT = ((unsigned)(-1))>>1;
    int MIN_INT = ~MAX_INT;

    printf("Max_int : %d\nMin_int : %d\n", MAX_INT, MIN_INT);
    return 0;
}


二、溢位問題:

INT_MIN和INT_MAX溢位問題

C中int型別32位,範圍是-2147483648到2147483647.

(1)最輕微的上溢是 INT_MAX + 1 :結果是 INT_MIN。 
(2)最嚴重的上溢是 INT_MAX + INT_MAX :結果是 -2。 
(3)最輕微的下溢是 INT_MIN - 1 :結果是 INT_MAX。 
(4)最嚴重的下溢是 INT_MIN +INT_MIN :結果是 0。

應付溢位的最佳方法就是防範於未然:充分了解資料的範圍,選擇恰當的變數型別。