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

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


一:什么是无符号数 ?

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


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


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

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


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

三:无符号数如何使用 ?

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

3 . 数据之间的联系:

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

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


有符号数 + 无符号数

#include 

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 
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


你可能感兴趣的:(C/C++)