当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

C语言 unsigned与signed区别

发表于: 2012-03-02   作者:ChuanSu   来源:转载   浏览次数:
摘要: 我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数据形式之一,可以究竟对于Integer的定义是什么呢? 翻书看下,在介绍Integer的时候,还有一个关键词就是size(范围) The C Programming Language
我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的

Integer type(整数形式)是C语言中的基本数据形式之一,可以究竟对于Integer的定义是什么呢? 翻书看下,在介绍Integer的时候,还有一个关键词就是size(范围)

The C Programming Language 写道
an integer,typically reflecting the natural size of integers on the host machine

Programming in ANSI C 写道
Integers are whole numbers with a range of values supported by a particular machine.


所以说,Integer是一个范围内的所有整数,但是范围是就特定计算机而言的(depends on computer).

开始之前,先来了解下很基础的知识 - 计算机的存储单位和整数存储在计算机所占的内存大小。
1).计算机最小的存储单位是“位” 也就是bit或binary digits,用来存放一个二进制数,即 0或1。 8个二进制位为一个字节Byte。
2).对于 16-bit(16位)的计算机,int是以两个字节来储存的,而32-bit的计算机,则是以4个字节,即32个bit来储存的。

如果想要明白singed与unsigned的区别,除了这两个基本知识,还需要了解整数在计算机中的存储方式,以16-bit 计算机为例,定义 int a = 1; 那么a的存储方式用表格来表示


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1


首先需要提到的一点是,在C语言中十进制的整数都会转化为二进制存储在计算机。继续,上面所声明的 int a = 1,也就是 int signed a =1,C语言默认a是一个signed类型。 上面表格中最左端的为最高位,最右端的为最低位。signed类型的整数,只用了去除最高位,剩下的15位来进行编码的,而最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。所以对于signed的整数,的存储范围是(-2^15 to 2^15-1),也就是 -32768 到 +32767的整数。
而对于unsigned的整数,其16位全部用来编码,存储范围便是(0 to 2^16-1),即 0到 65535 的非负整数。所以呢 你可以声明 int a = 1,或者 int a = -1, 但是不可以声明 unsigned a = -1 。但是需要提到的一点是,不管整数的类型是signed 还是 unsigned,都用了16位来存储,也就是说16位全部用来存储数据


上面所看到 a=1 的存储方式,就是将十进制的a在 程序员计算器 上转化为2字节的2进制,然后将这个结果放到上面的表格里。(原码存储)
可是对于 int a = -1 是怎样存储的?也就是说负数的存储方式是怎样的?
负数是以(补码存储),即是以原码的补码形式存储,看下面的表格


原码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

反码
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0


反码就是将原码中的二进制1改为0,二进制0改为1。下面取得反码之后,在反码的基础上加上1.即
补码
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1


不知道,说到这里,大家会不会有个疑惑,上面所说的signed与unsigned的范围是有交集的,即都包含了0到+32767范围的整数,那么这个范围的整数在声明为signed与unsigned的时候,存储方式一样吗?答案是肯定的,在这个范围内的整数,signed与unsigned 的存储方式是一样的。

刚开始学C,我也不清楚弄明白这些编码方式,存储方式有什么意义,我现在个人觉得,只是在声明int的时候,如果不能保证它的正整数性,就不要声明为unsigned,当然可以保证的前提下声明为unsigned,确实扩大了范围。



C语言 unsigned与signed区别

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
LaTex+MarkDown+Pandoc组合套件写博客的处女作,试试效果。各自的分工为:Latex下编辑公式,在Subli
C语言是面向过程的编程语言,而OC则是面向对象的编程语言。 面向对象:打个比方,就是你做一次菜,让老
最近大家在学《数据结构》,是用C语言来实现的,昨天室友问了我个问题,为什么代码执行完了,还没看
指针与地址 p = &c把c的地址赋值给p,我们称p为指向c的指针。地址运算符只能作用于内存中的对象,即
In particular, Microsoft® instituted a device driver certification process for its Windows® d
  看书的时候,发现了这四个函数,想知道他们的不同。结果上网查发现很多人说fgetc、fputc的f代表
说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上
空格符和空字符是不一样的,在ASCII里面,空格(space)符号的ASCII码是32,而空字符是0, 2个是完全不一
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一
思路 下图描述的是从问题引出到问题变异的思维过程: 概述 本文以数制转换为引,对递归进行分析。主
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号