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的存储方式用表格来表示

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,确实扩大了范围。

http://chuansu.iteye.com/blog/1435150

时间: 2024-10-11 04:36:37

unsigned与signed区别的相关文章

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 int

一段代码的疑问(1)——unsigned与signed

现象: 先来看一段代码: 这段代码的输出结果是: -84 4294967264 分析: [email protected]:~/cpp$ g++ -g c212.cc -o temp [email protected]:~/cpp$ ls c143.cc c144.cc c212.cc temp 可以看到多出一个temp文件 [email protected]:~/cpp$ gdb temp GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2

c语言中 char* 和 unsigned char* 的区别浅析(转)

原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用时作为函数的unsigned char*类型的参数调用.这个警告很容易避免,但是char*和unsigned char*到底有什么区别呢,本文作一个简单的探讨. char 和 unsigned char 的区别在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的.

C语言的补码表示和unsigned及signed的的转换

这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想. C语言的基本类型有char.int.float.double,另外还有说明符long.short.signed和unsigned. 首先要注意在不同操作系统中类型大小不一样,下面的情况只是考虑其中一种情况. int和char均默认为signed,二进制的最高一位来表示符号,0为正1为负. 假如short int是16位,由于第1位表示正负,所以只剩15位

mysql 中int类型字段unsigned和signed的探索

转自:http://www.0791quanquan.com/news_keji/topic_816453/ 探索一:正负数问题 拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 - 127. 那么如果我们在明确不需要负值存在的情况下,通常是不要设置signed来支持负数的. 因为只支持正数会让存储空间大一倍呢(当然我这种表达可能不准确). 假设我们使用tinyint来存储一些状态值. 0表示删除,1表示待付款,2表示已付款,3....

[C知识点]char unsigned char signed char知识点

1.char,unsigned char, signed char 都是占一个字节. 2.signed char范围为 -128-127  0000 0000表示+0 1000 0000表示-0.+0和-0表示的值是一样的.为了不浪费这一位用1000 0000表示128 unsigned char范围为 0-256. 3. char根据编译器的不同,被解释成signed char或者unsigned char. 4.VC编译器.x86上的GCC都把char定义为signed char,而arm-

unsigned 和 signed

http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html http://m.blog.csdn.net/blog/u010086298/37777607 先看两个例子 #include <stdio.h> int main(int argc, char *argv[]) { unsigned char a = -1; char b = a; printf("%d %d",a,b); return 0; }

char、signed char、unsigned char的区别

ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char char相当于signed char或者unsigned char,但是这取决于编译器! 这三种字符类型都是按照1个字节存储的,可以保存256个不同的值. 不同的是取值范围signed char取值范围是 -128 到 127unsigned char 取值范围是 0 到 255 signed char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,

char与unsigned char本质区别

char 与 unsigned char的本质区别 在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种