<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
sizeof:確定一種型別在開闢空間的時候的大小。
sizeof是關鍵字而不是函數,可以藉助編譯器來確定它的身份。
#include<stdio.h> int main() { int a = 10; printf("%dn", sizeof(a)); printf("%dn", sizeof(int)); printf("%dn", sizeof a); printf("%dn", sizeof int);//error return 0; }
sizeof(a)可以去掉()說明sizeof不是函數,是關鍵字(操作符),因為函數後面的括號是不能省略的。
sizeof在計算變數所佔的空間大小時,可以省略括號,而計算型別大小時,不能省略括號。
注:sizeof操作符裡面不能有其他運算,否則達不到預期的結果。
#include<stdio.h> int main() { int* p = NULL; int arr[10] = { 0 }; int* parr[3]; printf("%dn", sizeof(p));//p是指標變數,指標變數的大小是固定的4或者8 printf("%dn", sizeof(*p));//指標變數所指的變數所佔的記憶體的大小 printf("%dn", sizeof(arr));//sizeof(arr)中arr指整個陣列,即10個int型別元素。 printf("%dn", sizeof(arr[10]));//陣列越界 printf("%dn", sizeof(&arr));//&arr取得是整個陣列的地址 printf("%dn", sizeof(&arr[0]));//取的是首元素的地址,相當於指標 printf("%dn", sizeof(parr));//parr指整個陣列。 return 0; }
指標變數p所指向的變數型別為char,指標陣列parr中儲存的指標變數的型別為char時候:
char
unsigned char//無符號的字元型別
//取值範圍是0~255
//無符號表示二進位制的最高位不表示正負,該整型只為正數。
//但可以儲存負數,只是值會變成很大的正數
signed char//有符號字元
//取值範圍是-128~127
//因為字元的本質是ASCII碼值,在記憶體中以ASCII碼值進行儲存,所以劃分到整型家族
short
unsigned short [int]//無符號短整型
signed short [int]//有符號短整型
int
unsigned int//無符號整型
signed int//有符號整型
long
unsigned long [int]//無符號長整型
signed long [int]//有符號整型
long long
unsigned long long [int]//無符號更長的整型
signed long long [int] //有符號更長的整型
char到底是signed char (取值範圍-128~127)還是unsigned char(取值範圍0~255)
標準是為定義的,取決於編譯器的實現,小沐所使用的VS2019環境的char是signed char。
char a;// signed char a 或者 unsigned char a
int 標準定義是 signed int ,有符號整型,4個位元組,32個位元位
int a = 10;//signed int a //轉換成二進位制是00000000000000000000000000001010
一個變數的建立是要在記憶體中開闢空間的,空間的大小是根據不同的型別而決定的。
那麼,資料在所開闢記憶體中到底是如何儲存的呢?
計算機儲存數值時時儲存的該數值的二進位制的二補數的,而二補數是通過原碼和反碼進行換算得到的。
任何資料在計算機中,都必須轉換成二進位制,計算機只認識二進位制。
直接將數值按照正負數的形式翻譯成二進位制就可以得到原碼。
將原碼的符號位不變,其他位依次按位元取反就可以得到反碼。
反碼+1就得到二補數。
int a = 10; //00000000000000000000000000001010 a的原碼 //00000000000000000000000000001010 a的反碼 //00000000000000000000000000001010 a的二補數 //0x0000000a int b = -10; //10000000000000000000000000001010 b的原碼 //0x8000000a //11111111111111111111111111110101 b的反碼 //0xfffffff5 //11111111111111111111111111110110 b的二補數 //0xfffffff6
符號位+資料位
有符號數且正數,原碼,反碼和二補數相同。
有符號數且負數,原碼,反碼和二補數不相同,需要通過計算轉換。計算機記憶體儲的整型必須是二補數,符號位要參與計算的。
無符號數:沒有符號位,原碼,反碼和二補數相同。
int a = 20;
int b = -10;
我們知道,編譯器為 a 分配四個位元組的空間。那如何儲存呢?
首先,對於有符號數,一定要能表示該資料是正數還是負數。所以我們一般用最高位元位來進行充當符號位。
原碼、反碼、二補數
計算機中的有符號數有三種表示方法,即原碼、反碼和二補數。
三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位三種表示方法各不相同。
如果一個資料是負數,那麼就要遵守下面規則進行轉化:
原碼:直接將二進位制按照正負數的形式翻譯成二進位制就可以。
反碼:將原碼的符號位不變,其他位依次按位元取反就可以得到了。
二補數:反碼+1就得到二補數。
如果一個資料是正數,那麼它的原反補都相同。
無符號數:不需要轉化,也不需要符號位,原反補相同。
對於整形來說:資料存放記憶體中其實存放的是二補數。
//字面值轉二補數
int a = 20;
//20是正整數
//0000 0000 0000 0000 0000 0000 0001 0100
int b = -10;
//-10是正整數
//1000 0000 0000 0000 0000 0000 0000 1010
//1111 1111 1111 1111 1111 1111 1111 0101
//1111 1111 1111 1111 1111 1111 1111 0110
二補數轉原碼
方法一:先-1,在符號位不變,按位元取反。
方法二:將原碼到二補數的過程在來一遍。
原反補轉換需要通過計算機硬體來完成,
可以使用一條硬體電路就能完成原反二補數的轉換。
#include<stdio.h> int main() { unsigned int a = -10; //1000 0000 0000 0000 0000 0000 0000 1010-- -10的原碼 //1111 1111 1111 1111 1111 1111 1111 0110-- -10的二補數 printf("%dn", a); printf("%un", a); return 0; }
無符號整型變數a定義時,先有空間,再有內容,先將內容轉換成二進位制。 整型再儲存的時候,空間不關心內容的。
在將資料儲存在空間內的時候,資料已經被轉換成二進位制的二補數。
資料帶上型別才有意義。型別覺得了如何解釋空間內部儲存的二進位制序列。
變數的型別什麼時候起效果?
在讀取資料的過程中,變數的型別起效果。
//變數的存和取過程的結論:
//存:字面資料必須先轉成二補數,在放入空間當中。所以,所謂符號位,完全看資料本身是否攜帶±號。和變數是否有符號
無關!
//取:取資料一定要先看變數本身型別,然後才決定要不要看最高符號位。如果不需要,直接二進位制轉成十進位制。如果需要,則需要轉成原碼,然後才能識別。(當然,最高符號位在哪裡,又要明確大小端)
口訣:1後面跟n個0,就是2的n次方
67->64++1-->2^6+2^1+2^0
0000 0000 0000 0000 0000 0000 00100 0011
1->2^0
10->2^1
100->2^2
1000->2^3
後面跟n給位元位就是2^n
2^9->1000000000
在計算機系統中,數值一律用二補數來表示和儲存。原因在於,使用二補數,可以將符號位和數值域統一處理;
同時,加法和減法也可以統一處理(CPU只有加法器)。此外,二補數與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
什麼大端小端:
大端(儲存)模式,是指資料的低位儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址中;
小端(儲存)模式,是指資料的低位儲存在記憶體的低地址中,而資料的高位,,儲存在記憶體的高地址中。
例如:
0x11223344
為什麼有大端和小端:
因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8 bit。但是在C語言中除了8 bit的char之外,還有16 bit的short型,32 bit的long型(要看具體的編譯器),另外,對於位數大於8位元的處理器,例如16位元或者32位元的處理器,由於暫存器寬度大於一個位元組,那麼必然存在著一個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。
例如:一個 16bit 的 short 型 x ,在記憶體中的地址為 0x0010 , x 的值為 0x1122 ,那麼 0x11 為高位元組, 0x22 為低位元組。對於大端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,剛好相反。我們常用的 X86 結構是小端模式,而 KEIL C51 則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。
到此這篇關於C語言詳解關鍵字sizeof與unsigned及signed的用法的文章就介紹到這了,更多相關C語言 sizeof unsigned signed內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45