C语言中有符号与无符号
--事物的难度远远低于对事物的恐惧!
经过养成记1,已经有一个很好的开端,但革命尚未成功,坚持就是胜利!现在我们来分析下C语言中的有符号数与无符号数。我们知道,计算机只能识别二进制0和1,那么我们在程序中写的-12,计算机该怎么去识别这个"-"号?计算机怎么知道我们写的数,是正数还是负数?现在就一起来揭开这层面纱!
其实前辈大佬们早就对此作了规定了:把数据类型的最高位作为标识数据的符号位
-最高位为1:表明这个数是负数
-最高位为0:表明这个数是正数
下边直接上代码,实践是检验真理的唯一标准!
int main()
{char c = -5;short s = 5;int i = -1;//下边三条语句,只保留变量的最高位(符号位),其余置零int sign_c = (c & 0x80); //拆开就是 ( c 按位与上二进制1000 0000 )int sign_s = (s & 0x8000); //同上,仅仅变量占用内存大小不同int sign_i = (i & 0x80000000); //同上printf( "%d\n", (sign_c != 0) );printf( "%d\n", (sign_s != 0) );printf( "%d\n", (sign_i != 0) );return 0;
}
输出为:很明显了,变量c和变量i因为是负数,所以最高位为1,而变量s为正数,所以最高位为0。码不余欺也!
经过简单的实验,我们接着来分析,
一、有符号数在计算机中的的表示方法:在计算机内部,是用补码表示有符号数
-正数的补码是其本身
-负数的补码为负数的绝对值得各个位取反加1
举个例子:
8位整数 5的补码为:0000 0101
8位整数 -7的补码为:取绝对值|-7| = 7 --> 二进制为 0000 0111 --> 各个位取反 1111 1000 -->最后加1 -->1111 1001,所 以-7在计算机中就表示为1111 1001。
16位整数 20的补码为:0000 0000 0001 0100
16位整数 -13的补码为:1111 1111 1111 0011(可自行推导)
二、无符号数在计算机中的表示方法:计算机用原码表示无符号数
-无符号数默认为正数n
-无符号数没有符号位
无符号数最小值为0,最大值为其所占的位数全为1时的值。例如 8位无符号整数,最小值为0,最大值为二进制1111 1111,转换为十进制就是255。
对于固定长度的无符号数,
MAX_VALUE + 1 = MIN_VALUE
MIN_VALUE - 1 = MAX_VALUE
C语言中变量默认 为有符号的类型,如要将变量声明为无符号数,则需要使用unsigned关键字(C语言中只有整数类型能够声明为unsigned无符号变量)。
#include <stdio.h>int main()
{int i; //默认i为有符号数signed int j; //显示声明j为有符号数unsigned char min_value = 0; //显示声明k为无符号数unsigned char max_value = 255;unsigned char sub_result = min_value - 1; //无符号数最小值 - 1 = 最大值unsigned char add_result = max_value + 1; //无符号数最大值 + 1 = 最小值printf( "%d\n", sub_result ); //分析输出 255printf( "%d\n", add_result ); //分析输出 0return 0;
}
输出结果如下:码不余欺也!
问题思考:当有符号数遇到无符号数,会碰撞出什么火花?直接看下边代码,猜测下会输出什么。。。
#include <stdio.h>int main()
{unsigned char i = 5;char j = -10;if( (i + j) > 0 ) // 条件为真?还是为假?{printf("i + j > 0\n");}else{printf("i + j <= 0\n");}return 0;
}
输出如下:问题来了,我们表面看到的(5 + (-10)) > 0 居然!然而计算机是不会骗人的,且听我慢慢道来。。。。
咳咳,记住了,当有符号数与无符号数一起运算时,会将有符号数转换为无符号数!
所以上边的 无符号数5 与有符号数-10做运算时,会将-10转换成无符号数,通过前边我们描述的负数在计算机中的表示方式,可以推导出-10在计算机中的值为二进制11110110,这个被当成无符号数,这个数得多大啊,5 加上它,和肯定大于0!所以,还是码不余欺也!
再来思考个问题:下边代码会有什么输出?欢迎各位留言
#include <stdio.h>int main()
{unsigned int i = 0;for(i=9; i>=0; i--){printf("i = %u\n", i);}return 0;
}
总结:
1、有符号数用补码表示
-正数的符号位为0
-负数的符号位为1
2、无符号数用原码表示
-无符号数没有符号位
-无符号数只用于表示正数
3、unsigned只能用于修饰整数类型的变量
4、当有符号数与无符号数进行混合运算时,会将有符号数转换为无符号数,在做运算,运算结果为无符号数。
C语言中有符号与无符号相关推荐
- 【C语言进阶深度学习记录】二 有符号与无符号
今天学习C语言中的有符号与无符号 文章目录 1 计算机中的符号位 1.1 有符号数的表示法 1.2 无符号数的表示法 1.3 signed 和 unsigned 2 实验-当有符号数与无符号数进行运算 ...
- C语言——确定char、short、int和short变量有符号和无符号时的取值范围
C语言--确定char.short.int和short变量有符号和无符号时的取值范围 #include <stdio.h> #include <limits.h>// dete ...
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...
开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...
- C语言中的有符号与无符号(挖坑)
1.计算机中的符号位,计算机如何表示正数和负数? 数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 最高位为0,表明这个数为正数 2.有符号数的表示法 在计算机内部用补码表示有符号数 ...
- c语言整形符号位_C语言中整型无符号二进制数的表示问题
龙源期刊网 http://www.qikan.com.cn C 语言中整型无符号二进制数的表示问题 作者:马红旭 来源:<电子技术与软件工程> 2015 年第 20 期 摘 要 文章解决的 ...
- C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
在C语言的课本中,我们常见的是%u,但我们平时在写代码常用的确是%d,它们二者之间有什么区别呢? 表示形式上 %u表示输入输出格式说明符,是按照unsigned int(无符号十进制数据)格式输入或输 ...
- linux有符号和无符号,汇编中有符号与无符号数的区分
转载自:http://hi.baidu.com/asmsky/blog/item/7290d20076cab6da277fb5b8.html 一.只有一个标准! 在汇编语言层面,声明变量的时候,没有 ...
- c语言无符号扩展,深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...
开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...
- c语言中int默认是有符号还是无符号,C语言迷题:有符号数与无符号数的问题
前些天偶然看到了一个收集C语言迷题的网站,很是感兴趣.本人对C/C++语言本身很是感兴趣,曾经做过几年相应的开发,也算是相对比较熟悉的了,但也被其中的一些问题给难住了,毕竟这些问题都是涉及到非常细节的 ...
- c语言中的无符号字符指什么,深入分析C语言中的有符号和无符号
有符号和无符号指的是数字那么有符号和无符号的区别是什么,我们这里一起来看在C语言中的有符号和无符号分析吧,希望这篇文章能够对各位有用. 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我 ...
最新文章
- php使用NuSoap产生webservice结合WSDL让asp.net调用
- Lua(Codea) 中 table.insert 越界错误原因分析
- 华人首次!清华姚班助理教授张焕晨获得SIGMOD Jim Gray博士论文奖!
- AngularJS控制div隐藏或显示-ng-show
- AngularJS学习篇(十六)
- VMprotect简介
- ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记
- 五分钟了解数据库事务隔离
- 中国的这些民居都是你没见过的!
- freemarker的测试结果框架_java必背综合知识点总结(框架篇)
- mysql的配置文件适用5.6与5.7
- 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
- 公开密匙(public key)和专用密匙(private key)
- kali中rarcrack命令爆破rar压缩包密码
- 《活出生命的意义》生命之意义
- aws课程_AWS DeepRacer,Reinforcement Learning 101和一门关于AI管治的小课程
- python下载酷狗音乐源码
- 安卓使用opengles显示深度点云图或深度3D效果图
- 《历》·陕西帝王陵寝一览
- 三种方法求最大公约数及求n个数的最小公倍数
热门文章
- 分享十几个AI视频生成工具,附网站地址
- 如何控制负面情绪--认知疗法
- 工业级5G路由器/ 5G工业路由器
- 【历史上的今天】4 月 15 日:美国通用电气公司成立;第一届西海岸计算机展览会;Amiga 创始人出生
- 一键生成圣诞帽,快戴上你的圣诞帽吧 !
- IT30: IT男之家训(关于孩子)
- 小学计算机课画图软件,小学信息技术《快乐的小画家——画图篇》教案分析
- 电脑机械硬盘消失了固态还在
- 有计算机研究生的二区学校有哪些,深圳硕士研究生有哪些学校,深圳居然还有这么一所考研好学校!...
- 用开源飞控套件做一架Mini四轴飞行器