关于0x80000000为什么等于-2147483648和负数在内存上储存的问题
转载自大佬的博客https://blog.csdn.net/youyou362/article/details/72667951/
1·先说明负数怎么储存
(1)十进制负数是以其补码储存在内存上。
验证:求-8在内存上以二进制形式1的个数
思路是:拿变量,令值为1,与-8的二进制码的每一位做与运算,若与运算结果为1,则该位为1。
代码:
int NumberOf1(int n)
{
int count = ;
unsigned int value = ;
while (value != )
{
if (value&n)
{
count++;
}
value = value << ; //左移右边补0,当移完32为value为0.
}
return count;
}
结论:
输入-8,结果为29。
在32位系统上,-8的储存
-8的储存是以-8的补码,储存在内存上。
-8的原码 1000 0000 0000 0000 0000 0000 0000 1000
取反 由于第一位是符号位 不用改变 得:1111 1111 1111 1111 1111 1111 1111 0111
补码=反码+1 得::1111 1111 1111 1111 1111 1111 1111 1000
得到1的数量正好为29,所以-8的补码就是-8储存在内存上的二进制码
(2)但是在十六进制,负数在内存中储存的是原码
验证:
对int test = 0x80000001 (对应十进制为-1) 检查其内存上的1的个数,发现只有2个1
故内存上原码为 1000 0000 0000 0000 0000 0000 0000 0001.
对十六进制的-8也是2个1
(3)我们来看看0x80000000的输出
0x80000000 的二进制位
原码 1000 0000 0000 0000 0000 0000 0000 0000
若最高位为符号位,则为-0,可是输出int i = 0x80000000 发现i= -(2^31)
原因是在十六进制中负数的二进制原码的最高位是符号位,后面的31位为序号位,不是值位。1后面的000 0000 0000 0000 0000 0000 0000 0000,表示序号1,表示负数中,从小到大的第一位。
由于int的最小值为-2^31,排在负数从小到大的序号1,所以int i = 0x80000000 输出为 -(2^31)
我们来看看0xFFFFFFFF
原码 1111 1111 1111 1111 1111 1111 1111 1111
最高位为1 ,为负数,序号位为第(2^31)-1位 (111 1111 1111 1111 1111 1111 1111 1111=(2^31-1) 所以0xFFFFFFFF为负数从小到大 第2^31-1位 ,即
-2^31+2^31-1= -1
输出int i = 0xFFFFFFFF 为 -1 符合
(4)十进制的补码也符合 符号位+序号位的原则
就拿-8来做例子:
-8的补码:1111 1111 1111 1111 1111 1111 1111 1000 可以看出最高位为1 序号位为第2^(31)-8位,(111 1111 1111 1111 1111 1111 1111 1000 = 2^(31)-8 )
则该补码表示的值为2^31- 2^(31)-8 = -8 符合
------------------------------------------------------------------------
相关知识点补充:
十六进制用最高位作为符号位,1位负数,0为正数。
负数的位右移运算:
原则:若右移的数字为负值,则向右移动N位同时N个1补充在左边
若为正值,则以N个0补充在左边
---------------------
关于0x80000000为什么等于-2147483648和负数在内存上储存的问题的更多相关文章
- [负数在内存中的存储] 0x80000000 = -2147483648
		https://blog.csdn.net/youyou362/article/details/72667951/ 1. 十进制负数以其补码存储在内存上 例子:-8 在内存中表示为:1111 1111 ... 
- java中符号类型和无符号类型的问题分析
		一 参考博文 java中无符号类型的解决方案 二 java中的无符号数和有符号数 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 计算机中 ... 
- java中Math.abs(-2147483648)的返回值应该是什么?
		我觉得这是一个非常有意思的问题,Math.abs(-2147483648)的返回值应该是什么? java计算结果 为什么没有得到正数结果呢? 首先我们先看下java区分整数正负的原理.在二进制的情况下 ... 
- int是几位;short是几位;long是几位  负数怎么表示
		其实可以直接通过stm32的仿真看到结果:(这里是我用keil进行的测试,不知道这种方法是否准确) 从上面看, char是8位 short是4*4=16位 int是8*4=32位 long是8* ... 
- poj2184 Cow Exhibition【01背包】+【负数处理】+(求两个变量的和最大)
		题目链接:https://vjudge.net/contest/103424#problem/G 题目大意: 给出N头牛,每头牛都有智力值和幽默感,然后,这个题目最奇葩的地方是,它们居然可以是负数!! ... 
- Java中正负数的存储方式-正码 反码和补码
		Java中正负数的存储方式-正码 反码和补码 正码 我们以int 为例,一个int占用4个byte,32bits 0 存在内存上为 00000000 00000000 00000000 0000000 ... 
- [Java解惑]数值表达式
		声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ... 
- java位移运算符3 转
		https://www.cnblogs.com/winsker/p/6728672.html 移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数. 理解java移位运算符 运算 ... 
- CSAPP:信息的表和处理1
		CSAPP:信息的表和处理1 关键点:寻址.内存.磁盘.虚拟地址.物理地址.整型数组. 信息存储中的几个概念整型数据类型无符号数有符号数几个概念有符号数与无符号数之间转换基于栈与基于寄存器的区别 信息 ... 
随机推荐
- Java接口和抽象类详解
			父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ... 
- 在vscode中使用webpack中安装的echarts文件失败,dom获取class名,图表不显示
			所有的东西都是新学的,所以遇到了很多问题: (1)首先,在电脑上已经安装了node的情况下, 在npm中安装echarts:npm install echarts --save mac系统在最前面加上 ... 
- eclipse 配置
			访问地址 https://www.eclipse.org/ . . . 配置工作目录:存放1.项目代码 2.IDE相关配置信息 //修改编码时的字体 //修改编码格式 没有配置to ... 
- ps加强总结
			快捷键 1.ctrl+alt+z返回 2.ctrl+z撤销 3.ctrl+s保存 4.ctrl+shift+s另存为 5.shift是有序的选择 ctrl键是无序的选择 6.ctrl+g打组 ... 
- 了解MapReduce_2
			再写MapReduce执行流程之前,首先先对MapReduce有一些了解: 1. 简介 MapReduce是一个计算框架,既然是做计算的框架,那么表现的形式上就有输入,操作输入,得到结果2.主从结构 ... 
- android4.4 重启的开机不播放开机铃声,按power键的开机播放开机铃声
			平台:A33Android4.4Linux3.4 功能描述:实现重启的开机不播放开机铃声,按power键的开机播放开机铃声 一,无论关机还是重启都会经过rebootOrShutdown这个方法,在方法 ... 
- python最新笔试题
			这是笔者面试小十家公司后呕心沥血总结的一些笔试编程题~具体公司就不透露了.哎,说多了都是泪啊. 1.二分法查找: l = [1, 2, 3, 4, 5, 6, 7, 8, 9] find_num = ... 
- Python学习 :常用模块(三)----- 日志记录
			常用模块(三) 七.logging模块 日志中包含的信息应有正常的程序访问日志,还可能有错误.警告等信息输出 python的 logging 模块提供了标准的日志接口,你可以通过它存储各种格式的日志, ... 
- python财经数据接口包Tushare pro的入门及简单使用方式(大数据,股票数据接口)
			最近在做一个项目,需要用到股票的数据,我在网上查了很久,最终发现在股票数据上面还是tushare比较专业,而且对于将来做金融行业的大数据这一块的,tushare绝对是你的一个好帮手,所以下面我就简单介 ... 
- Android Log类基本用法
			Log类介绍: API for sending log output.Generally, use the Log.v() Log.d() Log.i() Log.w() and Log.e() me ... 
