C/C++ 有符号数和无符号数

  在开始话题前,不妨先来看看以下这段代码

 1 #include <iostream>
 2 #include <stdio.h>
 3 
 4 int main() {
 5     int a = -1;
 6     unsigned int b = 1;
 7     std::cout << "a > b is " << (a > b) << std::endl;
 8     std::cout << "a - b = " << (a - b) << std::endl;
 9     return 0;
10 }

  其实这段代码的目的很简单,就是给有符号变量a赋值为-1,给无符号变量b赋值为1,然后就比较大小以及求它们的差,很简单,对吧?对结果想必心里都有底了,但我们还是运行一下程序,印证我们的答案吧。

  如果输出结果和你心中的答案一样,那下面的内容就可以不用看了,如果不一样,那就看看吧。

  首先,当有符号数和无符号数一起运算时,所有数都会自动转换为无符号数。在计算机中,数值都是以补码的形式存在,对于-1来说,其在32位机器中表示为ffff_ffff,最高位为1,代表其是一个负数。当其转变为无符号数时,最高位不再代表正负,而是代表数值了。十六进制的无符号数ffff_ffff在十进制中是4294967295,也就是说转换为无符号数后,a=4294967295,而b=1,由此就可以理解为什么上述代码会得出这样的结果了。

  另外,对于浮点数来说,不存在无符号这一说法,浮点数都是有符号的,不存在有符号数向无符号数转换的问题。


 

  参考:有符号数和无符号数间的比较

posted @ 2015-06-27 19:24  越傻越快乐  阅读(1448)  评论(0编辑  收藏  举报