为什么有符号int的-1和无符号int的4,294,967,295都用ffffffff表示呢?
来源:3-10 提升补充部分:补码2
他门说这就是人生
2020-02-10
这是C++特有的表示方法吗?我觉得一个数字应该有一个统一的表示方法啊,无论什么数据类型?你看像windows计算器里表示的数值和C++里不一样,-1是FFFFFFFFFFFFFFFF,而4,294,967,295是FFFFFFFF。
2回答
-
并不是说这是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++语言历史悠久,所以包含的技术细节众多,所以大家学习时要更加细致。我这里将尽我可能把一些好的编程思想和重要的知识点给大家传达。但时间有限,我这不可能面面俱到,希望大家谅解, 我们多多交流,谢谢!
642023-01-16 -
AIxer
2020-02-11
其实是一样的,-1的二进制表示全是1,它显示那么多是因为你的操作系统是64位的,所以全表示出来了,但是4,294,967,295这个数用不了64位,前面都是0,Windows计算器就选择不把那些0显示出来了,而且在64位下就不应该用4,294,967,295这个数和-1比了,应该用2^65-1来比较
30
相似问题