tft每日頭條

 > 生活

 > unsigned是c語言關鍵字嗎

unsigned是c語言關鍵字嗎

生活 更新时间:2024-08-04 12:15:37

前言

我們都知道在計算機中最終所有的數據都會被轉化為0和1,存在磁盤裡面也是0和1,那不知道你們會不會有疑問,一個負數怎麼存?剛剛我們也說了所有的數據都會是0和1的去存那我們的“—”負号也是一樣被轉換成了,因為我們的負号不能以“—”存在磁盤裡面。

其實在我們電腦裡面對于存取數據都會把基本說一句類型的最高為騰出來用來裝我們的符号,然後規定是這樣的:如果是有符号的數據類型,最高位是1那就說明這個數是負數,如果是0的話那就說明這個數是正數。

signed 關鍵字

被修飾的變量說明是有符号位的,當我們從内存拿到這個變量的時候我們要根據最高為是0還是1來判斷數據的正負。

這樣的話我們一個32位的signed int類型整數可以表示的範圍隻有 -2^31~((2^31)-1),8位char 類型數,它的值表示範圍為 :-2^7~((2^7-)1)。反正我們要記住有符号的數據我們在判斷值的時候要把最高位舍棄掉,因為它不是值,而是表示正負的。

unsigned關鍵字

我們再來說一下我們的無符号整型數據,當被這個關鍵字修飾的時候就說明數據是沒有符号位的那到的數據全部都是真實的值。

我們一個32 位 unsigned int 可以表示的值的範圍在0~(2^32)-1,我們 8位的unsigned char類型的數值範圍是0~((2^8)-1)。

可能我們在聲明變量的時候很少用這兩個關鍵字來修飾變量,更多時候直接 int chat float ……等就開始定義變量了,那麼這時候它到底是有符号還是無符号數據類型的,其實如果我們沒有假關鍵字系統會默認給我們添加了signed 類型的,所以你可以忽略它的存在,但是要注意一點的是,我們的(char)類型的數據編譯器并不會自動給你加上。

趣味代碼

1#include<stdio.h> 2 #include<string.h> 3 4 5 int main () 6 { 7 signed char a[100]; 8 int i; 9 for(i=0;i<512;i ) 10 { 11 12 a[i]=-1-i; 13 //printf("a[%d]=%d",i,a[i]); 14 printf("%d ",a[i]); 15 if(((i 1)8)==0) 16 printf("\n\n"); 17 } 18 printf("\n數組長度%ld\n",strlen(a)); 19 return 0; 20 }

結果分析

你們覺得在這個代碼最後的結果會是什麼?我們很多人一看,就是數組長度呀,那不是100麼?但是我想告訴你的是代碼是255,為什麼?

我們先來分析一下程序是怎麼跑的,for循環中,當我們的 i 的值是0 的時候值是-1,關鍵是我們要知道我們的-1是怎麼存儲在我們的電腦中的,我們上過計算機系統的都知道存入電腦的數據都是以補碼的形式來存的,主要原因是使用補碼可以将我們的符号位和其他位統一處理,同時減法也可以按加法來處理,另外兩個補碼表示數的相加時,如果最高位(符号位)有進位則進位會被對齊,正數的 補碼和原碼一樣,我們負數的補碼:符号位是1,其餘位是該數值絕對值的原碼按位取反,然後整個數加1;

unsigned是c語言關鍵字嗎(C語言關鍵字unsigned和signed意義的探讨與學習)1

計算機中的負一

按照我們負數補碼的規則,我們可以知道 -1 的補碼是0xff,-2的補碼是0xfe……

我們看一下如果是八位的系統我們負一最高位是1。

第一步:1000 0000

第二步我們-1的絕對值是1,原碼:0000 0001

第三步按位取反:1111 1110

第四步 加1 :1111 1111

到這裡我們的-1的補碼就表示好了存在系統裡面的就是八個1,這時候我們驗證一下我們知道(-1) 1=0

那我們的:(1111 1111) 1=?

是不是:0000 0000 全部是0了,這和我們計算的一樣。

unsigned是c語言關鍵字嗎(C語言關鍵字unsigned和signed意義的探讨與學習)2

回到剛剛的程序

當我們的i的值為127的時候 a[127]的值是-128(1000 0001) 是char類型數據能表示的最小的負數了, 當 i 繼續增加a[128]的時候它的值肯定不是 -129 ,因為這時候發生溢出了呀,-129我們是需要9位才能存下來,但是我們的char類型隻有8位,所以這時候最高位的符号位被丢棄了,剩下的8位是原來9位補碼的低8位的值 0x7f(0 111 1111)(127) 這時候值是127 然後我們的i繼續走 執行(-1-i)=126,(0111 1110)……直到變為0000 0000 ,這時候随着i的增加我們的 a的值有編程了最開始的 (-1-0)=-1(1111 1111)然後(-1-1)=-2(1111 1110)說起來比較繞我們看看程序跑的結果我們可以分析出來程序是怎麼跑的了。

unsigned是c語言關鍵字嗎(C語言關鍵字unsigned和signed意義的探讨與學習)3

回到剛剛的-129的時候,我們把最高位丢棄,然後就變成了0x7f ,當我們的i繼續增加到255的時候,-256的補碼的低位為0,然後當i增加到256的時候,-127的補碼全為1,低8位的補碼為0xff,如此新的一輪循環開始……

結論

按照我們上面的分析a[0]~a[254]裡面的值都是不為0的,而a[255]的值為0,strlen函數是計算我們字符串長度的并不包含字符串後面的“\0”,判斷一個字符串的結束标志的是有沒有遇到“\0”,如果遇到了就停止計算了。所以我們說到這裡我們的值為什麼是255應該清楚了吧。但是今天并不是要讨論strlen的用法,希望大家知道的是signed char 類型範圍是[-128,127]超出這個範圍就會溢出了。另外你還要清楚負數的補碼該怎麼表示和計算。

unsigned是c語言關鍵字嗎(C語言關鍵字unsigned和signed意義的探讨與學習)4

哎呦終于說完了,你們慢慢消化吧,有什麼想法可以說出來大家一起學習一下!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved