C++ 整數極值及計算機表示方法

一 極值

可以使用 std::numeric_limits 獲取各種算術類型的最大最小值,頭文件 <limits>

定義於頭文件 <limits>
template< class T > class numeric_limits;
numeric_limits 類模板提供查詢各種算術類型屬性的標準化方式。
通過 numeric_limits 模板的特化提供此信息。標準庫爲所有算術類型制定可用的特化:

template<> class numeric_limits<bool>;
template<> class numeric_limits<char>;
template<> class numeric_limits<signed char>;
template<> class numeric_limits<unsigned char>;
template<> class numeric_limits<wchar_t>;
template<> class numeric_limits<char8_t>;    // C++20 特性
template<> class numeric_limits<char16_t>;   // C++11 特性
template<> class numeric_limits<char32_t>;   // C++11 特性
template<> class numeric_limits<short>;
template<> class numeric_limits<unsigned short>;
template<> class numeric_limits<int>;
template<> class numeric_limits<unsigned int>;
template<> class numeric_limits<long>;
template<> class numeric_limits<unsigned long>;
template<> class numeric_limits<long long>;
template<> class numeric_limits<unsigned long long>;
template<> class numeric_limits<float>;
template<> class numeric_limits<double>;
template<> class numeric_limits<long double>;

二 計算機表示方法

先看Demo 

#include <cstdint>
#include <iostream>
#include <limits>
#include <bitset>

int main() {
  char max = std::numeric_limits<char>::max();
  char min = std::numeric_limits<char>::min();

  std::cout << "char max : " << int(max) << " " << std::bitset<8>(max) << std::endl;
  std::cout << "char min : " << int(min) << " " << std::bitset<8>(min) << std::endl;

  std::cout << "0 : " << std::bitset<8>(0) << std::endl;
  std::cout << "-1 : " << std::bitset<8>(-1) << std::endl;

  std::cin.get();
  return 0;
}

結果:

char max :  127 01111111
char min : -128 10000000
 0 : 00000000
-1 : 11111111

說明:(int8_t爲例說明)

1. char類型(int8_t)的取值範圍爲: -128 ~ 127, 共計 2 ^ 8 = 256個。

2. 數值在計算機底層以二進制存儲。

3. 原碼反碼補碼是爲了輔助說明數值在計算機中的表示方法。不必過於糾結於原碼反碼補碼。

原碼:最基本的二進制表示法。最高位爲符號位,正數最高位爲0, 負數最高位爲1。其他位存放該數值的絕對值。

原碼舉例:

            1原碼:0 000 0001

           -1原碼:1 000 0001

反碼:正數的反碼 = 原碼; 負數的反碼 = 原碼除符號位外取反。

反碼舉例:

            1反碼:0 000 0001

           -1反碼:1 111 1110

補碼:正數的補碼 = 原碼; 負數的補碼 = 反碼 + 1。

補碼舉例:

            1補碼:0 000 0001

           -1補碼:1 111 1111   (例子結果)

正數以原碼錶示;負數以補碼錶示。

4. 特殊注意

0就別套概念了,全部位均是0;

最小值-128 : 1000 0000 怎麼表示出來的?不需計算,這是規定, 最高位爲1, 其他位全0。

三 參考

cppreference

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章