今天在看一道题目的时候,遇到了一个问题,就是关于数据类型最值的问题,这里介绍下int类型的取值范围,并且如何理解int取值范围

基本计算机知识

在我们了解今天的话题之前,我们需要了解如下的知识:

  1. 原码,补码,反码 ~~~~这都是什么鬼?
    举个最简单例子:
    例如 : 数字5的二进制 可以表示为(默认是32位机器) ,这里就是原码(第一位是符号位,0为正数,1为负数
    0000 0000 0000 0000 0000 0000 0000 0101
    
    对应反码为 0111 1111 1111 1111 1111 1111 1111 1010 ,反码计算规则:对于符号位其他的位取反就可以(也就是把0替换成1,把1替换成0)
    对应补码的计算规则为 (反码 + 1 ), 也就是 0111 1111 1111 1111 1111 1111 1111 1011
  2. 正数在计算机中如何表示?负数呢?
    计算机中,正数用原码表示,负数用补码(原码取反(符号位不变),然后加上1)表示
  3. c语言中的位数如何知道?
    最直接体现是由编译器自己决定的,但其实并没有这么简单,还收到OS影响,只有在OS支持下我们才可以由编译器决定!

计算int取值范围

这里博主OS系统位数为64,编译器如下图

1.确定int位数(1 字节(Byte) = 32 位(bit))

1
2
3
4
5
6
7
#include<stdio.h>
int main () {
int a = 2147483647;
/*通过sizeof 来计算int字节数,这里返回4,也就是4个字节 */
printf("%d\t", sizeof(int));
return 0;
}

2.确定int最大值

32位对应的int最大值 也就是 0111 1111 1111 1111 1111 1111 1111 1111
换算成10进制为 21 4748 3647(21亿多)

3.有一个小纰漏

既然0000 0000 0000 0000 0000 0000 0000 0000 和 1000 0000 0000 0000 0000 0000 0000 0000 都可以表示0,并且第一个最正确的说法是 正0,同理,第二个是 负0

不要忘记一件事:负数 永远用补码表示
对 1000 0000 0000 0000 0000 0000 0000 0000 求补码得到的正是 0000 0000 0000 0000 0000 0000 0000 0000

既然两个表示的是同一个,都表示0,那岂不是多了1个二进制数么,从而人为规定 原码中的1000 0000 0000 0000 0000 0000 0000 0000 表示 -32768,也就成了负数中的最小值

结论: int 在 32位 的环境中 范围是 -21 4748 3648 ~ +21 4748 3647