C语言中提供了很多整数类型(整型),主要区别在于它们取值范围的大小。int代表有符号的整数,也就是说,用int声明的变量可以是正数也可以是负数,也可以是零,但是只能是整数。
比如:int a = 3; int b = 0; int c = -5;
以上这些都是合法的。
int的取值范围因机器而异,一般而言,在较旧的PC上,int值在内存中一般是按2个字节(16位)进行存储的,在较新的PC以及工作站和大型机上,int值在内存中一般是按照4个字节(32位)进行存储的。

C语言中将基本数据类型划分为signed(有符号)和unsigned(无符号)两大类。
例如,初始化变量int a = -3;其实它等价于signed int a = -3;关键字signed在这里可以省略,因为C语言默认就是有符号类型的,如果要定义无符号类型的数(也就是0和正整数)可以这样定义,unsigned int b = 5;

为了说明清楚signed和unsigned的区别,首先需要了解数据在内存中是如何存储的,在计算机中所有的数据都是按照二进制进行存储的(以下假设在字长为2个字节的机器上来表示)。

举个例子来说,unsigned  int a = 1; 变量a在内存中就是以00000000 00000001来存储的,用图表的形式表示:

因为这里是unsigned  int,它是无符号整型,所以的它的16位全部用来表示数据。

int b = -1;

这里情况就稍微有点复杂了,注意数字1和-1在内存中的存储是完全不一样的,请看,

在计算机中,整数是以原码的形式存储的,而负数是以补码的形式存储的,原码大家都知道也就是它对应的二进制码,那什么是补码呢,就是原码的反码加1,反码就是原码的各位取反,例如-1的补码是:

首先1的原码是                     00000000 00000001

其次取它的反码是                 11111111 11111110

最后在其反码的基础上加上1   11111111 11111111

得到-1的补码是,11111111 11111111

用图表的形式表示:

http://hi.csdn.net/attachment/201008/11/0_1281514535se1Q.gif

从上图中可以看出,int用15位来表示一个数字,第1位被符号位占用了,其实大家应该不难看出在数学中-1是负数中最大的整数,所以这里看到它的各个位都置1,对应于二进制来讲就是最大的数了,计算机就是按照符号位来识别该数是正是负,所以第一位只起到标识的作用并不作为数据位来使用,而其余的15位才是真正的数据位。以补码的形式来存储有个好处那就是计算机将负数的运算当作加法来处理了。那么将一个有符号的数赋给一个无符号的数会发现一个很有趣的现象,比如:

unsigned int a;

int b = -1;

a = b;

printf("a=%u",a);

输出a=65535,这个结果是怎么出来的呢?其实很简单,b=-1,根据上图-1在计算机中的数据位是1111111 11111111,注意是数据位,是要去掉符号位的,所以是15位,a是无符号类型的整数,将b赋给a,自然a就是1111111 11111111,也是15位第一位补0,转换成十进制就是65535,它也是unsigned int范围的最大上限(0~65535 216-1),-1是最大的负整数转换成正整数当然也是最大了,这个应该很好理解了。

什么才是unsigned ?相关推荐

  1. led16*16点阵实验c语言,基于单片机的64*16LED点阵电子显示屏设计 pcb图+原理图+源程序...

    /*64*16点阵屏的显示点阵屏的显示*/ #include #include #include #define ulong  unsigned long #define uchar unsigned ...

  2. C 常數0L,0LL,0UL,0.0f,0.0L

    C 常數0L,0LL,0UL,0.0f,0.0L 參考連結 C/C++中各種不同型別的常數0,以不同的後綴表示: 0 //int 0L //long 0LL //long long 0UL //uns ...

  3. Gmapping Slam主要代码分析

    目录 main主函数 startLiveSlam函数 laserCallback激光处理回调函数 initMapper初始化地图函数 addScan激光数据处理函数 processScan函数 dra ...

  4. 手把手教你看懂并理解Arduino PID控制库——引子

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 本文主要依托于Brett Beauregard大神针对Arduino平台撰写的PID控制库Arduino PID Lib ...

  5. gmapping 算法流程整理

    slam_gmapping 是gmapping的 基于ros的壳,我们先从壳入手 *主要是学习曾书格老师注释的代码,如果需要的可以自取.2022年05月30日更新链接 链接: https://pan. ...

  6. Gmapping的个人理解

    Gmapping 第0章 源码阅读的一些预准备 0.1.算法简介 对于建图,SLAM,也称为 CML (Concurrent Mapping and Localization), 我们从名字就可以得知 ...

  7. [内核内存] slab分配器1---slab机制详解

    文章目录 1 slab分配器原理 2 slab分配器重要数据结构以及组织关系 2.1 slab cache描述符struct kmem_cache 2.2 slab描述符struct page 3.s ...

  8. 出现这四种情况,才是考虑分库分表的时候!

    来源:https://juejin.im/post/6844903992909103117 数据库瓶颈 不管是IO瓶颈还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的 ...

  9. unsigned int vs. size_t

    我注意到现代C和C ++代码似乎在任何地方使用size_t而不是int / unsigned int - 从C字符串函数的参数到STL. 我很好奇这个原因及其带来的好处. #1楼 size_t类型是无 ...

最新文章

  1. 几何画板自定义工具_用好神奇的数学工具--几何画板,轻松作出复杂的几何图形...
  2. android 系统倒计时显示时间,Android 依据系统时间整点、半点倒计时
  3. SO_REUSEADDR SO_REUSEPORT 解析
  4. 地推主管需要跑业务吗
  5. JSP内置 对象(下)
  6. autocad python二次开发_基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术
  7. C语言小案例_OA大典故障案例摘录【第1400篇】理光2501载体初始化
  8. TMOD、SCON、PCON寄存器的配置
  9. java将阿拉伯数字转换为中文数字
  10. 关于power apps
  11. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day6)
  12. HTML5制作个人理财系统,个人股票理财专题页面html模板
  13. 《Android之大话设计模式》--设计原则 第五章:迪米特法则 慈禧太后为何不和陌生人说话
  14. Vulkan学习(三):小结
  15. 微信小程序自定义顶部栏、等十个重要的常见功能总结
  16. IDEA的配置文件乱码
  17. 书架html5,基于HTML5 Canvas的CSG构造实体几何书架
  18. 人工智能导论实验二 食人族传教士过河+黑白棋 prolog+Python
  19. TP-LINK如何设置Wifi无线上网短信认证?
  20. CISSP一次通过指南(文末附福利)

热门文章

  1. 你有用过这样的变色镜片吗
  2. codemirror 光标定位_CodeMirror 中固定滚动位置
  3. 201X年度·微信个人收藏精选集(二)
  4. 浅谈Genymotion模拟器,专注开发
  5. 【自动驾驶轨迹预测】一文熟悉自动驾驶轨迹预测发展现状!
  6. AWTRIX时钟:一台可玩性极高的DIY时钟
  7. macos下的容器、宗卷、分区的主要区别及硬盘分区建议
  8. 数据结构和算法基础--线性表
  9. 一家电子商务公司计划在新年假期给客户打折。折扣将根据下单的金额进行计算。折扣金额是账单总金额中所有奇数的和。如果账单中不存在技术,则折扣将为0.
  10. 数字模拟电子计算机,数字与模拟电路计算机45汇编.ppt