无符号数 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 <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 ?)相关推荐
- 理解有符号数和无符号数的区别
理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...
- 11-有符号数和无符号数
1. 有符号数和无符号数 无符号数,因为没有符号位,所以只能表示一个正数. 有符号数,因为存在符号位,符号位如果是0的话,代表这是一个正数,符号位如果是1的话,代表这个数是一个负数. 我们可以用db伪 ...
- 理解有符号数和无符号数的区别。
理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...
- 理解有符号数和无符号数负数
理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的 ...
- 理解有符号数和无符号数
1.你自已决定是否需要有正负. 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可 ...
- C语言系列(二)有符号数和无符号数详解
1.你自已决定是否需要有正负: 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可 ...
- 有符号数和无符号数负数
From: http://blog.chinaunix.net/uid-26495963-id-3075227.html 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的 ...
- c语言 有符号数与0作比较大小,C语言中有符号数与无符号数能否进行比较运算...
无符号数和有符号数是不能进行比较运算的,否则可能会出现意想不到的错误,且极难检查出来! 首先肯几个例子(假设在32位的机器上): 1 1. 0 == 0U 2 2. - ...
- java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...
最新文章
- spring mvc项目中利用freemarker生成自定义标签
- 初步理解Java的三大特性——封装、继承和多态
- Android 开发工具类 36_ getSimSerial
- 【解题报告】Leecode 748. 最短补全词——Leecode每日一题系列
- 为什么姜黄素+胡椒碱会让姜黄素吸收率增加2000%以上
- 回退n帧协议c语言代码,[计算机网络]Ch.3 数据链路层
- lsattr/chattr
- Java提高篇 —— Java三大特性之继承
- extjs5(03--项目中文件的加载过程)
- java怎么写自定义布局_java-Android设置自定义首选项布局
- r语言热图对列不进行聚类_R语言:手把手教你画pheatmap热图
- java抖音字符视频_java爬取新版抖音无水印视频教程(2020/09/14附带java代码)
- IDEA Auto build completed with errors解决办法
- LabVIEW串口调试助手
- 题解报告——星际战争
- 视频剪辑软件调研(Corel VideoStudio 2018、爱剪辑、微剪辑)
- Visual Studio 2010安装、配置及使用
- 2019浙江计算机二级考试考纲,计算机二级考试大纲(2019全国计算机二级考试大纲)...
- IP地址、网络号、网关的区别
- 外行人如何通过学习软件测试转行IT