为什么有符号int的-1和无符号int的‭4,294,967,295‬都用ffffffff表示呢?

来源:3-10 提升补充部分:补码2

他门说这就是人生

2020-02-10

这是C++特有的表示方法吗?我觉得一个数字应该有一个统一的表示方法啊,无论什么数据类型?你看像windows计算器里表示的数值和C++里不一样,-1是‭FFFFFFFFFFFFFFFF‬,而‭4,294,967,295‬是‭FFFFFFFF‬。

http://img.mukewang.com/szimg/5e40d0aa092e0bcc03360541.jpg

http://img.mukewang.com/szimg/5e40d0b80982623303360541.jpg

写回答

2回答

quickzhao

2020-02-10

并不是说这是C++特有的编码方式。

计算机内部补码方式的整型数有两类:

     有符号数和无符号数;

     对无符号位很简单,所有的数都是非负的,累计2次幂计算就行;

如:

      FFFF FFFF FFFF FFFF = 2^63+2^62+...+2^0 = 18446744073709551615

     对有符号数如果是左起第一位是符号位,1表示-,0表示+;

问题是你首先得确定位长度, 对64位有符号数系统

如:

      FFFF FFFF FFFF FFFF =   -2^63+2^62+2^61+...+2^0 = -1;

上图中两个结果,明显你的计算器系统是Windows64位有符号系统。

对第一个结果,事实上是:

     0000 0000 FFFF FFFF = 2^31+2^32+...+ 2^0 = 4294967295   (注意这里符号为位0)

对第二个结果,

     FFFF FFFF FFFF FFFF =   -2^63+2^62+2^61+...+2^0 = -1;   (事实上对所有有符号数的系统而言,当位数相同时所有的FF表示的数都是-1,比如对8位数而言FF就是-1, 对16位而言,FFFF就是-1, 对32位而言,FFFF FFFF 就是-1; 而这里由于是64位FFFF FFFF FFFF FFFF就是-1

                                   

而C++语言包含了这两类表示法, 

     有符号数使用int定义;如 int a = -1024;

     无符号数使用unsigned int定义;如unsigned int = 1024;  

C++语言的int型是4bytes,也就是32位的有符号数,所以:

     0xFFFFFFFF 是-1; 


另:C++语言历史悠久,所以包含的技术细节众多,所以大家学习时要更加细致。我这里将尽我可能把一些好的编程思想和重要的知识点给大家传达。但时间有限,我这不可能面面俱到,希望大家谅解, 我们多多交流,谢谢!

6
4
龙晓秀
感谢老师回答 很细致
2023-01-16
共4条回复

AIxer

2020-02-11

其实是一样的,-1的二进制表示全是1,它显示那么多是因为你的操作系统是64位的,所以全表示出来了,但是4,294,967,295这个数用不了64位,前面都是0,Windows计算器就选择不把那些0显示出来了,而且在64位下就不应该用4,294,967,295这个数和-1比了,应该用2^65-1来比较

3
0

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3884 学习 · 1103 问题

查看课程