包含无符号数的计算
文章目录
当表达式中存在有符号类型和无符号类型时,所有的操作数都自动转换成无符号类型。
例一
运行如下程序:
|
|
程序输出结果:
4294967293
在32位机器中,i*-1的值为4294967293。
在32位机器中,无符号int的值域是[0,4294967295],有符号int的话,值域是[-2147483648,2147483647],两个值域的个数都是4294967296个,即[0,4294967295]= [0,2147483647]U[2147483648,4294967295]有符号bit的[-2147483648,-1]对应于无符号im的[2147483648,4294967295]区域,两个区 域的值是映射关系。所以,-11对应4294967295, -2对应4294967294, -3对应4294967293。
例二
unsigned short A=10;
printf("〜A= %u\n",〜A);
输出是什么?
因为A为无符号短整型变量,值为10,在32位机器中,转换为二进制为0000 0000 0000 0000 0000 0000 0000 1010,对 A 取反操作,所以〜A 的二进制位为 1111 1111 1111 1111 1111 1111 1111 0101,十六进制表示即为0xFFFFFFF5,而如果将该数转换为符号整型的话则为-11,因为输出的是无符号整型,无符号整型的范围为0〜4294967295,而0xFFFFFFF5转换为无符号十进制整型为4294967285。所以程序的输出结果为4294967285。
例三
usigned int a;
a=7;
cout<<a-7<<endl;
cout<<a-8<<endl;
-7首先被转换成一个很大的数,然后与7相加后正好溢出,其值为0.
-8首先被转换成一个很大的数,然后与7相加。两个数相加后为很大的整数(差1就正好溢出了)
文章作者 Forz
上次更新 2017-09-05