有关int与unsigned的区别

来源:互联网 发布:马来西亚导航软件 编辑:程序博客网 时间:2024/05/16 10:14

以前在学习C语言时一直没有彻底的明白unsigned int 与int的区别,当时好像有一个概念就是负数用补码来表示,而相应的补码是通过把原码取反后加1得到补码,在其中符号位是不变的。今天到一本书上说,对于无符号数据来说,右移是逻辑的,也就是说在高位上是补0的,这个是肯定的,道理很明显;而对于有符号的数据,其右移为 算术的逻辑的都是可以的,不过基本上所有的编译器与机器组合对于有符号数据都使用算术右移,也就是说高位补符号位。验证如下:

在这里取十进制数34来做为例子,在这里我才想起来从原码到补码的算法,一开始还把符号位都变了,真是基础知道不扎实啊。

34转换成十六进制就是0X22,二进制为00100010,

对于-34来说,对应的为二进制原码为:1000 0000 0000 0000 0000 0000 0010 0010,其反码为:1111 1111 1111 1111 1111 1111 1101 1101,通过加1得到补码,在机器中负数是通过补码来表示的:1111 1111 1111 1111 1111 1111 1101 1110,十六进制为0xffffffde;

接下来我把其右移3位,按理论上来说结果应该是:1111 1111 1111 1111 1111 1111 1111 1011,即0XFFFFFFFB。

验证如下:

结果正确。

今天终于把这个早就应该明白的东西搞懂了。以前一直怕麻烦,或者说书上写的是怎么样的就是怎么样,看过了就以为自己明白了。其实不然,许多的小东西,只有你真正你实践才能明白其中的真正的意思,在这个实践的过程中会发现原来自己以为自己很懂,但实际上没懂的东西。加油,从基础做起,从小事做起。

 

对于有符号与无符号的转换,在这里我用T表示有符号,U表示无符号,T2U即把有符号数转换成无符号数,U2T无符号转换成有符号数;

W表示位数,在这取W为8,

有符号数的大小范围为:-2^(w-1)到2^(w-1)-1,即-128到127;

无符号数的大小范围为:0到2^(w)-1,即0到255;

 

当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言中会隐含地将有符号参数强制类型转换为无符号,并假设这两个数都是非负的,来执行这个运算。