无符号数 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 -1 == -1 ?)
- 【1】ptr = malloc(0*sizeof(char))【2】关于typedef的用法总结【3】关于有符号数、无符号数和数据类型的总结
- 【1】ptr = malloc(0*sizeof(char))【2】关于typedef的用法总结【3】关于有符号数、无符号数和数据类型的总结 .
- 不使用> < == 判断无符号数大小
- 返回无符号整形的二进制数1的个数
- 求无符号数中1的个数
- 注意无符号数
- 无符号数处理
- 无符号数加减乘除
- 无符号数
- 无符号数tips
- Java无符号数
- 无符号数加减
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- Android View事件的分发机制
- CUDA-Ray Tracing
- 合并排序算法
- HDU 5066 Harry And Physical Teacher
- 二叉树的最大深度
- 无符号数 0 ( 0 -1 == -1 ?)
- html--1.html基础
- Java8新特性之默认方法
- Boyer-Moore算法Java实现
- 前端脚本化http
- [JZOJ5012]远行
- 2016年操作系统课程(大二下)演示程序集合
- 算法训练-数列
- HDU2689 Sort it(树状数组求逆序数)