--事物的难度远远低于对事物的恐惧!

经过养成记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语言中有符号与无符号相关推荐

  1. 【C语言进阶深度学习记录】二 有符号与无符号

    今天学习C语言中的有符号与无符号 文章目录 1 计算机中的符号位 1.1 有符号数的表示法 1.2 无符号数的表示法 1.3 signed 和 unsigned 2 实验-当有符号数与无符号数进行运算 ...

  2. C语言——确定char、short、int和short变量有符号和无符号时的取值范围

    C语言--确定char.short.int和short变量有符号和无符号时的取值范围 #include <stdio.h> #include <limits.h>// dete ...

  3. 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  4. C语言中的有符号与无符号(挖坑)

    1.计算机中的符号位,计算机如何表示正数和负数? 数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 最高位为0,表明这个数为正数 2.有符号数的表示法 在计算机内部用补码表示有符号数 ...

  5. c语言整形符号位_C语言中整型无符号二进制数的表示问题

    龙源期刊网 http://www.qikan.com.cn C 语言中整型无符号二进制数的表示问题 作者:马红旭 来源:<电子技术与软件工程> 2015 年第 20 期 摘 要 文章解决的 ...

  6. C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)

    在C语言的课本中,我们常见的是%u,但我们平时在写代码常用的确是%d,它们二者之间有什么区别呢? 表示形式上 %u表示输入输出格式说明符,是按照unsigned int(无符号十进制数据)格式输入或输 ...

  7. linux有符号和无符号,汇编中有符号与无符号数的区分

    转载自:http://hi.baidu.com/asmsky/blog/item/7290d20076cab6da277fb5b8.html 一.只有一个标准! 在汇编语言层面,声明变量的时候,没有 ...

  8. c语言无符号扩展,深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  9. c语言中int默认是有符号还是无符号,C语言迷题:有符号数与无符号数的问题

    前些天偶然看到了一个收集C语言迷题的网站,很是感兴趣.本人对C/C++语言本身很是感兴趣,曾经做过几年相应的开发,也算是相对比较熟悉的了,但也被其中的一些问题给难住了,毕竟这些问题都是涉及到非常细节的 ...

  10. c语言中的无符号字符指什么,深入分析C语言中的有符号和无符号

    有符号和无符号指的是数字那么有符号和无符号的区别是什么,我们这里一起来看在C语言中的有符号和无符号分析吧,希望这篇文章能够对各位有用. 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我 ...

最新文章

  1. php使用NuSoap产生webservice结合WSDL让asp.net调用
  2. Lua(Codea) 中 table.insert 越界错误原因分析
  3. 华人首次!清华姚班助理教授张焕晨获得SIGMOD Jim Gray博士论文奖!
  4. AngularJS控制div隐藏或显示-ng-show
  5. AngularJS学习篇(十六)
  6. VMprotect简介
  7. ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记
  8. 五分钟了解数据库事务隔离
  9. 中国的这些民居都是你没见过的!
  10. freemarker的测试结果框架_java必背综合知识点总结(框架篇)
  11. mysql的配置文件适用5.6与5.7
  12. 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
  13. 公开密匙(public key)和专用密匙(private key)
  14. kali中rarcrack命令爆破rar压缩包密码
  15. 《活出生命的意义》生命之意义
  16. aws课程_AWS DeepRacer,Reinforcement Learning 101和一门关于AI管治的小课程
  17. python下载酷狗音乐源码
  18. 安卓使用opengles显示深度点云图或深度3D效果图
  19. 《历》·陕西帝王陵寝一览
  20. 三种方法求最大公约数及求n个数的最小公倍数

热门文章

  1. 分享十几个AI视频生成工具,附网站地址
  2. 如何控制负面情绪--认知疗法
  3. 工业级5G路由器/ 5G工业路由器
  4. 【历史上的今天】4 月 15 日:美国通用电气公司成立;第一届西海岸计算机展览会;Amiga 创始人出生
  5. 一键生成圣诞帽,快戴上你的圣诞帽吧 !
  6. IT30: IT男之家训(关于孩子)
  7. 小学计算机课画图软件,小学信息技术《快乐的小画家——画图篇》教案分析
  8. 电脑机械硬盘消失了固态还在
  9. 有计算机研究生的二区学校有哪些,深圳硕士研究生有哪些学校,深圳居然还有这么一所考研好学校!...
  10. 用开源飞控套件做一架Mini四轴飞行器