一直在學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位全部用來存儲數據