C语言中signed和unsigned理解

一直在学java,今天开始研究ACM的算法题,需要用到C语言,发现好多知识点都不清楚了,看来以后要多多总结~

signed意思为有符号的,也就是第一个位代表正负,剩余的代表大小,例如:signed int 大小区间为-128-127

unsigned意思为无符号的,所有的位都为大小,没有负数,例如:unsigned int 大小区间为:0-255

当然 默认为signed


如果想要明白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位全部用来存储数据 

原文地址:https://www.cnblogs.com/lyxcode/p/9449466.html