C语言使用unsigned把负数转换成整数是怎么计算的?

如题所述

你问题是使用unsigned把负数转正数吧?
用unsigned把负数转正并不改变变量的内存形态,也就是二进制编码不会改变,而逻辑数值上的变化可通过二进制的补码去计算,等价于2^变量位数减去负数绝对值(^表示冥)。
比如一个32位的负数值是-N,那么转化成unsigned的值是2^32 - N。
再比如16位整型,short a = -1; 转成无符号的值为 (unsigned short)a == pow(2, 16) - 1 == 65535;追问

怎么看它是32位还是16位的?比如我出一个数,-100,那它是几位的?

追答

看你定义的类型啊,32位程序里int型是32位,你直接用常整数默认就是int型,常数小数默认是double。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-28
#include <stdio.h>
void main()
{
signed num=-1; //定义一个有符号负数
unsigned uNum; //声明一个无符号变量用来存储正数
uNum=(unsigned)(num); //强制转化成无符号正数
printf("%u\n",uNum); //打印出结果
}本回答被网友采纳
第2个回答  2012-12-17
所谓有符号和无符号整数的主要区别是如何看待最高位。
对于单字节二进制数01010110,无符号整数为86,有符号数也为86,因为最高位为0,所以二者间没有区别。
对于二进制数10101100来说,无符号数为172,有符号数则为-84。二者区别很大。
第3个回答  2012-12-17
补码直接变成正数,如-X 就是0xFFFFFFFF+1-X (X>0)
第4个回答  2012-12-17
负数的补码等于其符号位不变,数值部分的各位取反,然后整个数加1。

参考资料:http://baike.baidu.com/view/377340.htm

相似回答