int 为什么是2147483647_现在的C语言编辑器里的int范围为什么是-2147483648~2147483647...
下面是引用百度文库的一段话:
“这得从二进制的原码说起:
如果以最高位为符号位,二进制原码最大为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...相关推荐
- 现在的C语言编辑器里的int范围为什么是-2147483648~2147483647
下面是引用百度文库的一段话: "这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为111111111111111 ...
- c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...
关于char强制转换成int到底是用0还是用1补位的猜想与检验 最近学C语言发现char强制转换时值会完全不同,而且变化很大,于是决定写代码测试一下. 先检验一下char型的-3和3在内存中分别怎么表 ...
- [C语言]关于指针和int型的一道题目
题目就下面几行,问printf的输出是什么? int main() {unsigned int a[3] = {0x010203, 0x040506, 0x070809};unsigned int * ...
- 十六进制数用int吗_你真的精通C语言吗?来解这十道C语言迷题试试吧!
本文展示了10个C语言的迷题以及答案,而且有相当的一些例子可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言. 如果你不看答案,不知道是否有把握回答各个谜题?让我们来试试. 1.会输 ...
- 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?
原标题:[揭秘]C语言类型转换时发生了什么? ID:技术让梦想更伟大 作者:李肖遥 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮 ...
- c 语言 int argc,C语言深度学习之int main(int argc,char **argv)的理解及延申
C语言深度学习之int main(int argc,char **argv)的理解及延申 前者为可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含 ...
- C 语言char类型与int类型的转化
目录 一.char转int 法一:直接转换 ASSCII编码表 ASCII可显示字符 法二:利用库函数转换 二.数字换成字符串 1.用sprintf 2.用库函数 char和int的转换有两种方式,这 ...
- c语言用int取整取了小数_[c语言取整算法]C语言中float型数据怎么取整数部分算法或取小数部分...
C语言中float型数据怎么 取整数部分算法 或取小数部分 float福n=12.223; int x=(int)n; float y=n-(float)x; C语言有哪些取整函数? C语言有以下几种 ...
- C语言 字符串转换成int、long和double型
#include <stdio.h> #include <stdlib.h> #define LENGTH 128int main(void){char str[LENGTH] ...
最新文章
- Python 运行 Python hello.py 出错,提示: File stdin , line 1
- ie 访问 java接口_Java基础面试题 库(1~10)
- 博为峰Java技术文章 ——JavaSE Swing JPanel III
- Linux命令更新系统时间,更新所有文件的时间(转)
- 怎么查看Beyond Compare所有会话日志消息
- adb logcat 查看日志
- typora 分割线_实战 | 五分钟,使用Typora+PicGo提升百倍写作效率
- Java基础知识2(字符串)
- Linux配置自建 YUM 软件存储库
- 写贺卡给毕业师姐怎么写计算机系的,给师兄师姐的毕业贺卡寄语
- 选择困难症? 看看这几款主流的文档管理系统
- Linux 系统中成功恢复已删除的文件
- Python 编写函数实现交叉合并字符串,例如:ABCD与1234的合并结果是A1B2C3D4
- 【文献阅读】Multi-state MRAM cells for hardware neuromorphic computing
- Feng Shui POJ - 3384 [半平面交]
- 【使用java swing制作简易贪吃蛇游戏】软件实习项目二
- 关于Omnipeek遇到“试图执行的操作不受支持”问题
- 金融科技的下一战场:从金融普惠到技术普惠
- 数学类笔试题(四分位数、数据规约和协方差)
- 机器语言、汇编语言和高级语言之间的关系
热门文章
- Quartz2D简单绘制之矩形椭圆
- javascript加密七种方法
- leetcode 45 python
- C语言课后习题(33)
- android 字符串转字节数组,java – 在Android中将字节数组转换为Charsequence
- undolog 是binlog_mysql日志redo log、undo log、binlog以及作用看这篇就可以啦
- 直播丨云原生数据库PolarDB年度发布
- 2019年11月数据库流行度排行:前三甲大幅下跌 PM 应云而升 国产续领风云
- 移动计算云分布式数据缓存服务,实现快速可靠的跨区域多活复制
- Java的这个强大功能,很多人都不知道