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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值