最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳解關鍵字sizeof與unsigned及signed的用法

 更新時間:2022年06月14日 11:07:45   作者:沐曦希  
這篇文章主要為大家詳細介紹了C語言關鍵字sizeof&&unsigned&&signed,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最冤枉的關鍵字sizeof理解

sizeof:確定一種類型在開辟空間的時候的大小。

被誤解為函數(shù)

sizeof是關鍵字而不是函數(shù),可以借助編譯器來確定它的身份。

#include<stdio.h>
int main()
{
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof int);//error
	return 0;
}

sizeof(a)可以去掉()說明sizeof不是函數(shù),是關鍵字(操作符),因為函數(shù)后面的括號是不能省略的。

sizeof在計算變量所占的空間大小時,可以省略括號,而計算類型大小時,不能省略括號。

注:sizeof操作符里面不能有其他運算,否則達不到預期的結果。

sizeof(int)*p 表示什么意思

#include<stdio.h>
int main()
{
	int* p = NULL;
	int arr[10] = { 0 };
	int* parr[3];
	printf("%d\n", sizeof(p));//p是指針變量,指針變量的大小是固定的4或者8
	printf("%d\n", sizeof(*p));//指針變量所指的變量所占的內存的大小
	printf("%d\n", sizeof(arr));//sizeof(arr)中arr指整個數(shù)組,即10個int類型元素。
	printf("%d\n", sizeof(arr[10]));//數(shù)組越界
	printf("%d\n", sizeof(&arr));//&arr取得是整個數(shù)組的地址
	printf("%d\n", sizeof(&arr[0]));//取的是首元素的地址,相當于指針
	printf("%d\n", sizeof(parr));//parr指整個數(shù)組。
	return 0;
}

指針變量p所指向的變量類型為char,指針數(shù)組parr中存儲的指針變量的類型為char時候:

signed與unsigned 關鍵字

有符號整數(shù)vs無符號整數(shù)

char
 unsigned char//無符號的字符類型
 //取值范圍是0~255
 //無符號表示二進制的最高位不表示正負,該整型只為正數(shù)。
 //但可以儲存負數(shù),只是值會變成很大的正數(shù)
 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)

標準是為定義的,取決于編譯器的實現(xiàn),小沐所使用的VS2019環(huán)境的char是signed char。

char a;// signed char a 或者 unsigned char a

int 標準定義是 signed int ,有符號整型,4個字節(jié),32個比特位

int a = 10;//signed int a
//轉換成二進制是00000000000000000000000000001010

整形在內存的存儲

一個變量的創(chuàng)建是要在內存中開辟空間的,空間的大小是根據(jù)不同的類型而決定的。

那么,數(shù)據(jù)在所開辟內存中到底是如何存儲的呢?

計算機存儲數(shù)值時時存儲的該數(shù)值的二進制的補碼的,而補碼是通過原碼和反碼進行換算得到的。

任何數(shù)據(jù)在計算機中,都必須轉換成二進制,計算機只認識二進制。

原碼

直接將數(shù)值按照正負數(shù)的形式翻譯成二進制就可以得到原碼。

反碼

將原碼的符號位不變,其他位依次按位取反就可以得到反碼。

補碼

反碼+1就得到補碼。

int a = 10;
//00000000000000000000000000001010 a的原碼
//00000000000000000000000000001010 a的反碼
//00000000000000000000000000001010 a的補碼
//0x0000000a
int b = -10;
//10000000000000000000000000001010 b的原碼
//0x8000000a
//11111111111111111111111111110101 b的反碼
//0xfffffff5
//11111111111111111111111111110110 b的補碼
//0xfffffff6

符號位+數(shù)據(jù)位

有符號數(shù)且正數(shù),原碼,反碼和補碼相同。

有符號數(shù)且負數(shù),原碼,反碼和補碼不相同,需要通過計算轉換。計算機內存儲的整型必須是補碼,符號位要參與計算的。

無符號數(shù):沒有符號位,原碼,反碼和補碼相同。

int a = 20;

int b = -10;

我們知道,編譯器為 a 分配四個字節(jié)的空間。那如何存儲呢?

首先,對于有符號數(shù),一定要能表示該數(shù)據(jù)是正數(shù)還是負數(shù)。所以我們一般用最高比特位來進行充當符號位。

原碼、反碼、補碼

計算機中的有符號數(shù)有三種表示方法,即原碼、反碼和補碼。

三種表示方法均有符號位和數(shù)值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數(shù)值位三種表示方法各不相同。

如果一個數(shù)據(jù)是負數(shù),那么就要遵守下面規(guī)則進行轉化:

原碼:直接將二進制按照正負數(shù)的形式翻譯成二進制就可以。

反碼:將原碼的符號位不變,其他位依次按位取反就可以得到了。

補碼:反碼+1就得到補碼。

如果一個數(shù)據(jù)是正數(shù),那么它的原反補都相同。

無符號數(shù):不需要轉化,也不需要符號位,原反補相同。

對于整形來說:數(shù)據(jù)存放內存中其實存放的是補碼。

//字面值轉補碼

int a = 20;

//20是正整數(shù)

//0000 0000 0000 0000 0000 0000 0001 0100

int b = -10;

//-10是正整數(shù)

//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("%d\n", a);
	printf("%u\n", a);
	return 0;
}

無符號整型變量a定義時,先有空間,再有內容,先將內容轉換成二進制。 整型再存儲的時候,空間不關心內容的。

在將數(shù)據(jù)保存在空間內的時候,數(shù)據(jù)已經被轉換成二進制的補碼。

數(shù)據(jù)帶上類型才有意義。類型覺得了如何解釋空間內部保存的二進制序列。

變量的類型什么時候起效果?

在讀取數(shù)據(jù)的過程中,變量的類型起效果。

//變量的存和取過程的結論:

//存:字面數(shù)據(jù)必須先轉成補碼,在放入空間當中。所以,所謂符號位,完全看數(shù)據(jù)本身是否攜帶±號。和變量是否有符號

無關!

//?。喝?shù)據(jù)一定要先看變量本身類型,然后才決定要不要看最高符號位。如果不需要,直接二進制轉成十進制。如果需要,則需要轉成原碼,然后才能識別。(當然,最高符號位在哪里,又要明確大小端)

十進制二進制快速轉化

口訣: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

為什么存儲的是補碼

在計算機系統(tǒng)中,數(shù)值一律用補碼來表示和存儲。原因在于,使用補碼,可以將符號位和數(shù)值域統(tǒng)一處理;

同時,加法和減法也可以統(tǒng)一處理(CPU只有加法器)。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。

大小端

什么大端小端:

大端(存儲)模式,是指數(shù)據(jù)的低位保存在內存的高地址中,而數(shù)據(jù)的高位,保存在內存的低地址中;

小端(存儲)模式,是指數(shù)據(jù)的低位保存在內存的低地址中,而數(shù)據(jù)的高位,,保存在內存的高地址中。

例如:

0x11223344

為什么有大端和小端:

因為在計算機系統(tǒng)中,我們是以字節(jié)為單位的,每個地址單元都對應著一個字節(jié),一個字節(jié)為8 bit。但是在C語言中除了8 bit的char之外,還有16 bit的short型,32 bit的long型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著一個如何將多個字節(jié)安排的問題。因此就導致了大端存儲模式和小端存儲模式。

例如:一個 16bit 的 short 型 x ,在內存中的地址為 0x0010 , x 的值為 0x1122 ,那么 0x11 為高字節(jié), 0x22 為低字節(jié)。對于大端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,剛好相反。我們常用的 X86 結構是小端模式,而 KEIL C51 則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。

到此這篇關于C語言詳解關鍵字sizeof與unsigned及signed的用法的文章就介紹到這了,更多相關C語言 sizeof unsigned signed內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 中二分查找遞歸非遞歸實現(xiàn)并分析

    C++ 中二分查找遞歸非遞歸實現(xiàn)并分析

    這篇文章主要介紹了C++ 中二分查找遞歸非遞歸實現(xiàn)并分析的相關資料,需要的朋友可以參考下
    2017-06-06
  • c++ static詳細使用分析

    c++ static詳細使用分析

    在C++中,static是一個關鍵字,用于聲明靜態(tài)成員、靜態(tài)局部變量以及靜態(tài)函數(shù),這篇文章主要介紹了c++ static詳細分析,需要的朋友可以參考下
    2024-05-05
  • linux之awk命令的用法

    linux之awk命令的用法

    awk是一個非常棒的數(shù)字處理工具。相比于sed常常作用于一整行的處理,awk則比較傾向于將一行分為數(shù)個“字段”來處理。運行效率高,而且代碼簡單,對格式化的文本處理能力超強
    2013-10-10
  • C++特殊成員函數(shù)以及其生成機制詳解

    C++特殊成員函數(shù)以及其生成機制詳解

    這篇文章主要給大家介紹了關于C++特殊成員函數(shù)以及其生成機制的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • C/C++?for?語句的要點與注意事項小結

    C/C++?for?語句的要點與注意事項小結

    C/C++ 中的?for?語句是一種常用的循環(huán)結構,用于重復執(zhí)行一段代碼,直到滿足某個條件為止,這篇文章主要介紹了C/C++?for?語句的要點與注意事項,需要的朋友可以參考下
    2024-06-06
  • C++類型轉換運算符詳解

    C++類型轉換運算符詳解

    這篇文章主要介紹了C++類型轉換運算符的相關資料,希望通過本文大家能夠掌握這部分內容,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • 淺談C++11中=delete的巧妙用法

    淺談C++11中=delete的巧妙用法

    本文主要介紹了C++11中=delete的巧妙用法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++ 虛函數(shù)表圖文解析

    C++ 虛函數(shù)表圖文解析

    最近學了設計模式中的簡單工廠模式,對多態(tài)有了具體的認識。于是補了補多態(tài)、虛函數(shù)、虛函數(shù)表相關的知識,本文介紹了C++ 虛函數(shù)表,感興趣的了解一下
    2021-05-05
  • C++ 實現(xiàn)求小于n的最大素數(shù)的實例

    C++ 實現(xiàn)求小于n的最大素數(shù)的實例

    這篇文章主要介紹了C++ 實現(xiàn)求小于n的最大素數(shù)的實例的相關資料,需要的朋友可以參考下
    2017-05-05
  • 算法詳解之分治法具體實現(xiàn)

    算法詳解之分治法具體實現(xiàn)

    這篇文章主要介紹了算法詳解之分治法具體實現(xiàn),需要的朋友可以參考下
    2014-02-02

最新評論

巫溪县| 诸城市| 噶尔县| 朝阳市| 庐江县| 图木舒克市| 保山市| 双桥区| 长子县| 大新县| 吴川市| 辽宁省| 冷水江市| 高台县| 兰考县| 肥城市| 华池县| 洪洞县| 太原市| 都昌县| 七台河市| 浮梁县| 陈巴尔虎旗| 资溪县| 石门县| 阿拉善左旗| 平武县| 邹平县| 岱山县| 麻城市| 孝昌县| 鄂托克前旗| 美姑县| 佛教| 永康市| 盱眙县| 腾冲县| 呼伦贝尔市| 积石山| 鹤山市| 兴隆县|