有符号数与无符号数之间的转换

来源:互联网 发布:淘宝店铺进货 编辑:程序博客网 时间:2024/05/17 23:47

如何以十六进制表示负数

在C/C++编程中整数常用的有2种表现形式,一种是以十进制表示,一种是以十六进制表示。同时这些整数又区分为有符号数无符号数。其中让人有点困扰的是有符号数中负数的16进制表示法。比如-20,它的十六进制原码为0x1001 0100(0x94),补码为0x1110 1100(0xec)。在软件中如果想将-20以十六进制形式赋给一个char型有符号变量,则应该使用如下代码:

char cValue = 0xec;  //0xec是-20的补码,不能用-20的原码0x94表示

由此可见,软件中负数的十六进制应该用补码表示

代码中负数怎么转换为补码形式(也就是无符号数)

有时我们需要在代码中将负数转换为补码形式,最方便的方式就是直接将十进制的负数赋值给一个无符号数变量,如:

unsigned char uValue = -20;  //则uValue就会变为-20的补码0xec

如何手动地将有符号数转换为无符号数(也就是补码)

负数转换为补码步骤:保持符号位不变,先将其余位取反,再加上1。 手动用这个步骤去计算负数的补码显然比较慢。比较快的方法是用模的概念来计算

-20转换为无符号数是0xec(就是-20的补码),0xec的十进制是正数236。而abs(-20) + 236正好等于256。256就是8bit数的模,再比如对于16bit的数,模为65536。所以将负数转换为无符号数,实际就是这个负数与模相加后得到的值

如何手动地将无符号数(也就是补码)转换为有符号数

无符号数转换为有符号数时先看无符号数的最高比特位,如果是0,则可以直接转换。如无符号数0x14转换为有符号数就是20。如果最高位为1,则也需要用模的概念来计算。如0xec(十进制为236),转换为有符号数是-20。实际就是这个无符号数减去模后得到的值

0 0