下面是引用百度文库的一段话:

“这得从二进制的原码说起:

如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为1111111111111111=-(215-1)=-32767

此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0

所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有216-1个,比16位二进制能够提供的216个编码少1个。 但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到

0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。

到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了

0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示216个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。 所以,补码系统中,范围是-32768~32767。

因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。 ”

因为当时的计算机普遍是16位,而现在的计算机普遍32位,所以上面的结论也就相应的变成了-2的31次方到2的31次方。这样的话范围是-2147483647~2147483647 但是由于人为规定的100000…000(31个0)为-2147483648,所以范围就变成了-2147483647~2147483647 。

下面再讲一下关于算术溢出的问题的问题,溢出就是取模。弄懂了原码、补码的概念后,会发现其实都是有规律可循的。比如-1强制转换成unsigned int 后是4294967295.

int的范围是:-2147483648~2147483647 unsigned int的范围是:0~4294967295。如果超出这个范围会出现循环比如-2147483648-1=2147483647;4294967295+1=0;

也可以堪称是取模后的说,比如int的模是 2147483648(2的31次方)。unsigned int的模是4294967296(2的32次方);比如4294967297%4294967296=1(与超出范围得到的结果相同4294967297超出2所以-1+2=1);

计算机的处理方式真的很神奇,这样最大的数+1变成了最小的数,最小的数-1又成了最大的数。所有的数都连成了一个圆环。

要注意的是-2147483648这个数虽然是int的下限,但是计算机在处理的时候先是2147483648再加上一个-运算符,但是2147483648这一步的时候已经超出的int的范围,所以它比较特殊,直接赋值int a=-2147483648VC会有警告,(处理办法是int a=-2147483647-1就没警告了,或者是调用#include里的常量INT_MIN)

int 为什么是2147483647_现在的C语言编辑器里的int范围为什么是-2147483648~2147483647...相关推荐

  1. 现在的C语言编辑器里的int范围为什么是-2147483648~2147483647

    下面是引用百度文库的一段话: "这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为111111111111111 ...

  2. c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...

    关于char强制转换成int到底是用0还是用1补位的猜想与检验 最近学C语言发现char强制转换时值会完全不同,而且变化很大,于是决定写代码测试一下. 先检验一下char型的-3和3在内存中分别怎么表 ...

  3. [C语言]关于指针和int型的一道题目

    题目就下面几行,问printf的输出是什么? int main() {unsigned int a[3] = {0x010203, 0x040506, 0x070809};unsigned int * ...

  4. 十六进制数用int吗_你真的精通C语言吗?来解这十道C语言迷题试试吧!

    本文展示了10个C语言的迷题以及答案,而且有相当的一些例子可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言. 如果你不看答案,不知道是否有把握回答各个谜题?让我们来试试. 1.会输 ...

  5. 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?

    原标题:[揭秘]C语言类型转换时发生了什么? ID:技术让梦想更伟大 作者:李肖遥 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮 ...

  6. c 语言 int argc,C语言深度学习之int main(int argc,char **argv)的理解及延申

    C语言深度学习之int main(int argc,char **argv)的理解及延申 前者为可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含 ...

  7. C 语言char类型与int类型的转化

    目录 一.char转int 法一:直接转换 ASSCII编码表 ASCII可显示字符 法二:利用库函数转换 二.数字换成字符串 1.用sprintf 2.用库函数 char和int的转换有两种方式,这 ...

  8. c语言用int取整取了小数_[c语言取整算法]C语言中float型数据怎么取整数部分算法或取小数部分...

    C语言中float型数据怎么 取整数部分算法 或取小数部分 float福n=12.223; int x=(int)n; float y=n-(float)x; C语言有哪些取整函数? C语言有以下几种 ...

  9. C语言 字符串转换成int、long和double型

    #include <stdio.h> #include <stdlib.h> #define LENGTH 128int main(void){char str[LENGTH] ...

最新文章

  1. Python 运行 Python hello.py 出错,提示: File stdin , line 1
  2. ie 访问 java接口_Java基础面试题 库(1~10)
  3. 博为峰Java技术文章 ——JavaSE Swing JPanel III
  4. Linux命令更新系统时间,更新所有文件的时间(转)
  5. 怎么查看Beyond Compare所有会话日志消息
  6. adb logcat 查看日志
  7. typora 分割线_实战 | 五分钟,使用Typora+PicGo提升百倍写作效率
  8. Java基础知识2(字符串)
  9. Linux配置自建 YUM 软件存储库
  10. 写贺卡给毕业师姐怎么写计算机系的,给师兄师姐的毕业贺卡寄语
  11. 选择困难症? 看看这几款主流的文档管理系统
  12. Linux 系统中成功恢复已删除的文件
  13. Python 编写函数实现交叉合并字符串,例如:ABCD与1234的合并结果是A1B2C3D4
  14. 【文献阅读】Multi-state MRAM cells for hardware neuromorphic computing
  15. Feng Shui POJ - 3384 [半平面交]
  16. 【使用java swing制作简易贪吃蛇游戏】软件实习项目二
  17. 关于Omnipeek遇到“试图执行的操作不受支持”问题
  18. 金融科技的下一战场:从金融普惠到技术普惠
  19. 数学类笔试题(四分位数、数据规约和协方差)
  20. 机器语言、汇编语言和高级语言之间的关系

热门文章

  1. Quartz2D简单绘制之矩形椭圆
  2. javascript加密七种方法
  3. leetcode 45 python
  4. C语言课后习题(33)
  5. android 字符串转字节数组,java – 在Android中将字节数组转换为Charsequence
  6. undolog 是binlog_mysql日志redo log、undo log、binlog以及作用看这篇就可以啦
  7. 直播丨云原生数据库PolarDB年度发布
  8. 2019年11月数据库流行度排行:前三甲大幅下跌 PM 应云而升 国产续领风云
  9. 移动计算云分布式数据缓存服务,实现快速可靠的跨区域多活复制
  10. Java的这个强大功能,很多人都不知道