无符号数 0 ( 0 -1 == -1 ?)

来源:互联网 发布:廖雪峰python 编辑:程序博客网 时间:2024/04/29 15:55

无符号数运算 应该注意什么?


一:什么是无符号数 ?

无符号数(unsigned number) 是相对于有符号数而言的,指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。


有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。


二:为什么有无符号数存在 ?

1 . 无符号数这个概念是编程语言所特有的数据类型,它我们是现实生活中遇到的各种形形色色的数据的映射,有些场合出现的数字不可能小于零,因此无符号数便应运而生,很好地实现了现实数据到计算机数据的抽象,提供了计算机处理输入数据的手段。


2 . 无符号数是建立在有符号数的概念之上的 。 表示数据大小的范围是有符号数的两倍,有更强大的表示张力。

三:无符号数如何使用 ?

1 . 表示方法:unsigned int i = 666 ;
2 . 表示范围:对于int ( 若是 16 bit )类型的变量而言,i 的范围是 0 ——> 65535 。

3 . 数据之间的联系:

无符号数据——无符号数据: 正常运算,结果为无符号数据。

无符号数据——有符号数据: 类型提升,因为无符号数级别大于有符号数级别,因此有符号数会类型提升为无符号数,可能会出现很奇葩的结果,但这取决于你如何解释它,什么意思?


有符号数 + 无符号数

#include <stdio.h>int main(void){    unsigned int ui = 6;    int i = -12 ;    // 有符号数和无符号数相加时,有符号数的类型被提升到无符号数,最高位符号位变成数据位,如果对它的解释时无符号数的话,将非常可怕,例如:    printf("%u\n",( ui+i ) );                // 无符号数解析:结果是  4294967290 一个超级大数    printf("%d\n",( ui+i ) );                //  有符号数解析: 结果是  -6     if ( (ui+i) > 0 )                         // 0  默认是有符号数,也会被提升(unsigned int )0 ,结果 (ui + i ) > 0 成立。        printf(" (ui+i) > 0 is True \n");     if ((ui + i) > (unsigned int)0)         // 同上。        printf("(ui+i) > (unsigned short int)0 is True\n");    return 0;}

结果:
4294967290
-6
(ui+i) > 0 is True
(ui+i) > (unsigned short int)0 is True


四 : 无符号数 0 - 1 是什么 ?

C ++ 实现

#include <iostream>using namespace std;int main(void){    unsigned short int i =0;    int j = 8,p;    p = j<<1;    i =i-1;    cout <<"i = " << i;                cout <<"\n p = " << p;    return 0;}

结果:
i = 65535 p = 16


为什么 ?

1 . 16位的范围是:(无符号)0——>65535 (65536个数字 2^16=65536) ;

2 . sizeof(short) =2 (16 bits) , unsigned short int a = 0 ;

3 . 0000_0000_0000_0000 减 1 就变成 (1111_1111_1111_1111) (无符号数表示为65535) ;


总结以下:

1 . 总之,不管怎么样,无符号和有符号一起运算,有符号会类型提升,运算正常运算。

2 . 其实,对于结果是什么,取决于我们如何去解析结果,是有符号还是无符号 才是重点。

3 . 比如: int a = -1 ; printf("%u\n",a); 结果不是 -1 。

int main(void){    short int a = -1;    printf("%u\n",a);         // 无符号解析 %u     printf("%i\n",a);        // 有符号解析 %d 或者 %i     return 0;}

结果:

4294967290

-1


0 0
原创粉丝点击