`
ChuanSu
  • 浏览: 53524 次
  • 性别: 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语言中unsigned、类型转换与程序的可移植性.pdf

    unsigned与signed的区别在于对其位模式的解释,也就是最高位的处理不同。无符号整数把所有位处理为数据位,而有符号整数视最高位为符号位,当其值为1时表示该数为负,值为0时表示该数为正。 在C语言中,对整型使用...

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

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

    北京航空航天大学 c语言

    这些类型的长度和数值范围都受到运行平台的影响,例如,signed和unsigned的使用会影响最高位的解释,决定数据的正负以及能表示的最大值和最小值。 无符号整型用于表示非负整数,其数值范围比对应的有符号类型大一倍...

    C语言常用宏定义技巧

    需要注意的是,上面列出的一些类型的定义如`byte`、`word`等,虽然在某些情况下会被使用,但并不推荐在新项目中使用,因为它们可能与特定平台的标准库冲突。 #### 四、获取内存中的单字节或多字数据 为了从内存中...

    C语言宏定义技巧大全

    "C语言宏定义技巧大全" 本资源主要介绍了C语言宏定义的各种技巧,旨在帮助开发者养成良好的宏编程习惯,从而提高代码的可读性、可移植性和方便性。 一、防止重复包含 在C语言中,头文件的重复包含是一个常见的问题...

    C语言的数据类型与格式控制

    C语言的数据类型与格式控制 C语言中有多种基本类型,包括字节型(char)、整型(int)和浮点型(float/double)。这些基本类型可以使用符号属性(signed、unsigned)和长度属性(short、long)来说明变量的取值区间...

    单片机C语言课件PPT

    C51的数据类型包括基本类型和组合类型,如char型(有signed和unsigned之分)、float型(与double型等效),以及特殊功能寄存器型和位类型,这些都是为了适应MCS-51的硬件特性。例如,char型可以用来存储单字节数据,...

    C语言的宏定义的技巧

    C语言宏定义的技巧 C语言中宏定义的技巧是非常重要的,写好C语言,漂亮的宏定义可以防止出错,提高可移植性和可读性,方便后续的开发和维护。下面列举了一些常用的宏定义技巧: 1. 防止头文件被重复包含 宏定义...

    单片机C语言教程与指导

    这些数据类型的长度、存储空间以及值域都有明确规定,例如,无符号字符(unsigned char)的值域为0到255,而有符号字符(signed char)的值域为-128到127。 3. **MCS-51存储结构**:位变量(bit)必须存储在MCS-51...

    STM32—C语言数据类型核心知识

    STM32-C语言数据类型核心知识 STM32-C语言数据类型核心知识是指在STM32微控制器中使用C语言编程时,数据类型的定义和转换规则。了解这些规则对于编写高效、可靠的程序非常重要。 在STM32中,数据类型可以分为整型...

    C语言程序设计_习题大全(含答案)_C语言-

    C语言提供了32个关键字,如auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、...

    初学C语言:03 C语言基础

    * 不能与关键字相同 * 不能包含汉字 * 建议命名应直观、易懂 * 建议命名不要太长 例如,有效的标识符命名有:A_8、lastName、count、MyCity_money等。 二、关键字 关键字是C语言中预定义的单词,用于定义变量、...

    华科C语言课件之数据类型

    华中科技大学的计算机科学与技术专业中,对C语言的深入讲解尤其注重数据类型的理解和运用。 首先,数据类型是一组特定值的集合,这些值包括常量、变量和函数。数据类型的划分是基于它们所需的存储空间和能表示的...

    浅谈C语言数据与内存分配空间和地址的联系

    基于给定文件的信息,本文将深入探讨C语言中数据与内存分配空间及地址之间的关联,并通过对几种典型数据类型的分析帮助读者更好地理解这一概念。 ### 一、基础数据类型 C语言的基础数据类型主要包括整型(int)、...

    C语言学习大纲__郝斌(讲解)

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

    C51-单片机C语言程序设计.ppt

    本资源摘要信息主要介绍C51单片机C语言程序设计的相关知识点,包括C语言程序结构、C语言与MCS-51单片机、C51程序结构、C51的数据类型等。 C语言程序结构: * C语言程序采用函数结构,每个C语言程序由一个或多个...

    c语言大一小白基础笔记

    整型变量可以加unsigned或signed修饰符,默认情况下是signed类型,unsigned类型不可以存储负数。 3.2.4 字符型数据 字符型数据是指以字符形式存在的数据,每个字符占用一个字节(8位),存储方式是ASCII码形式。...

    c语言技术基础 电子教案

    【C语言技术基础 电子教案】是一份详细讲解C语言基础知识的教程,涵盖了从语言概述到数据类型与运算等多个核心章节。C语言起源于70年代的贝尔实验室,经过多次改进,最终形成了ANSI C标准,它兼备汇编语言的高效和...

    凌阳C语言应用编 从基础开始介绍

    综上所述,凌阳C语言应用编为开发者提供了一套详尽的指南,涵盖了凌阳C语言的特性、基本数据类型、变量的signed和unsigned选择、实参求值顺序以及C与汇编的混合编程。这些内容对于想要在凌阳单片机平台上进行高效...

Global site tag (gtag.js) - Google Analytics