`
ChuanSu
  • 浏览: 52770 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

C语言 unsigned与signed区别

阅读更多
我们来一起看下,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的存储方式用表格来表示


0000000000000001


首先需要提到的一点是,在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 是怎样存储的?也就是说负数的存储方式是怎样的?
负数是以(补码存储),即是以原码的补码形式存储,看下面的表格


原码
0000000000000001

反码
1111111111111110


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


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

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



2
0
分享到:
评论

相关推荐

    基于C语言char与unsigned char的区别介绍

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别。 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,...

    C语言宏定义技巧(常用宏定义)

    C语言宏定义技巧(常用宏定义) 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复...

    c语言数据测试

    C语言数据类型测试 ANSI 表准中的数据类型定义 char 8 -127--127 unsigned char 8 0---255 signed char 8 -127 -- 127 int 16 -32

    c语言入门教程.txt

    union unsigned void volatile while C语言还包括一些不能用做标识符的扩展关键字。 asm cdecl _cs _ds _es far huge interrupt near pascal _ss 所以在以后的学习中,在给变量命名时要避开这些关键字。 3. Turbo C...

    C语言中的所有关键字

    (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 (10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无...

    非常好的C语言基础项目资源,分享出来.zip

    │ │ │ ├── 1、signed 和 unsigned.txt │ │ │ ├── 2、void指针.txt │ │ │ ├── 3、volatile中的使用.txt │ │ │ ├── 4、空结构体有多大?.txt │ │ │ ├── 5、柔性数组.txt │ │ │ ├─...

    linux c 语言串口调试

    整型的每一种都有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的...

    C语言的基础知识学习个人总结集合.zip

    │ │ │ ├── 1、signed 和 unsigned.txt │ │ │ ├── 2、void指针.txt │ │ │ ├── 3、volatile中的使用.txt │ │ │ ├── 4、空结构体有多大?.txt │ │ │ ├── 5、柔性数组.txt │ │ │ ├─...

    详解C语言中的char数据类型及其与int类型的转换

    char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed。虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围是0~127),但实际...

    C语言编程注意事项.docx

    19. char类型转换为int型时, 因为无法判断它是signed还是unsigned,这样其结果有可能为负数, 所以转换时尽量指定signed和unsigned限制符。 20. ++i与i++ 的不同之处: ++i是先 +1再使用i, i++ 是先使用i再 +1。 21...

    C语言 位段的详细介绍

     其中type只能为int,unsigned int,signed int三种类型(int型能不能表示负数视编译器而定,比如VC中int就默认是signed int,能够表示负数)。位段名称var是可选参数,即可以省略。digits表示该位段所占的二进制位数...

    初级C语言教案 auto break case char const

    初级C语言教案 适用于初学者,对初学者很有帮助.里面介绍的 很详细auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof ...

    (谭浩强)c语言学习书

    8•与汇编语言相比,用C语言写的程序可移植性好。 但是,C语言对程序员要求也高,程序员用C写程序会感到限制少、灵活性大,功能强,但较其他高级语言在学习上要困难一些。 1.5 面向对象的程序设计语言 在C的基础上...

    C语言深度解剖(完美版).pdf

    1.4,signed、unsigned 关键字................................................................................................19 1.6,if、else 组合..........................................................

    PID算法C程序

    C语言PID算法 typedef struct PID //定义算法核心数据 { signed int Vi_Ref; //速度PID,速度设定,Velocity signed int Vi_FeedBack; //速度PID,速度反馈值 ,m*50 signed long Vi_PreError; //速度PID ,前一...

    C语言 由ANSI标准定义的32个关键字

    auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static

    C语言程序设计标准教程

     长整数158L和基本整常数158 在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意,避免...

    C语言关键字大全(共32个)

    声明字符型变量或函数 struct:声明结构体变量或函数 union:声明共用数据类型 enum :声明枚举类型 typedef:用以给数据类型取别名 const :声明只读变量 unsigned:声明无符号类型变量或函数 signed:声明有符号...

    msp430 C语言例程

    16x16 Unsigned Multiply Accumulate 8x8 Unsigned Multiply Accumulate 16x16 Signed Multiply Accumulate 8x8 Signed Multiply Accumulate Configure RST/NMI as NMI XT2 Oscillator Fault Detection Software ...

    c___s_t_d_i_n_t_._h_____c(C语言 库文件)

    听说这个有用 The following are typedefs of fundamental integral types or ... In any case, if either the signed or the unsigned version is defined, both the signed and unsigned versions are defined.

Global site tag (gtag.js) - Google Analytics