附帶操作符的優(yōu)先性和結(jié)合性圖片
在講解操作符之前需要講解一下原反補(bǔ)和進(jìn)制之間的轉(zhuǎn)換
并且在講解操作符的時(shí)候會重點(diǎn)對難點(diǎn)進(jìn)行講解,也就是算數(shù)操作符和邏輯操作符
并且會在講解附帶實(shí)例 和最后面的代碼分析
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
補(bǔ)碼反碼掩碼以及原理
補(bǔ)碼、反碼和掩碼是計(jì)算機(jī)科學(xué)中用于表示和處理數(shù)值的三種編碼方式。
原碼
原碼是最直觀的數(shù)值表示方法,它將數(shù)值的二進(jìn)制表示與其符號位結(jié)合起來。在原碼表示中,正數(shù)的符號位為0,而負(fù)數(shù)的符號位為1。原碼的缺點(diǎn)在于它無法直接表示負(fù)數(shù),因?yàn)樵谟?jì)算負(fù)數(shù)的時(shí)候需要進(jìn)行特殊的處理。
反碼
反碼用于簡化負(fù)數(shù)的運(yùn)算。對于正數(shù),其反碼與原碼相同;對于負(fù)數(shù),反碼是將原碼除符號位外的所有位取反(0變1,1變0)。反碼解決了原碼在進(jìn)行加減運(yùn)算時(shí)需要額外的符號位轉(zhuǎn)換的問題,但它仍然存在正負(fù)零的區(qū)分問題。
?
補(bǔ)碼
補(bǔ)碼是目前計(jì)算機(jī)中最常用的數(shù)值表示方法。對于正數(shù),補(bǔ)碼與原碼相同;對于負(fù)數(shù),補(bǔ)碼是在反碼的基礎(chǔ)上加1。補(bǔ)碼的優(yōu)點(diǎn)在于它將符號位的概念和數(shù)值的表示統(tǒng)一起來,并且使得加法和減法運(yùn)算統(tǒng)一化,簡化了計(jì)算機(jī)內(nèi)部的邏輯電路設(shè)計(jì)。
下面順便提一嘴掩碼,不過多贅述。
掩碼
掩碼通常用于位操作中,它是一個(gè)用于遮掩或選擇特定位數(shù)的二進(jìn)制數(shù)。在計(jì)算機(jī)編程中,掩碼常用于位運(yùn)算,比如設(shè)置或清除特定的位。通過掩碼,可以很方便地控制數(shù)值的某幾位是否參與運(yùn)算或被設(shè)置為特定的值。
例如,如果要設(shè)置一個(gè)整數(shù)的第3位到第5位,可以構(gòu)造一個(gè)掩碼,其中只有這些位是1,其余位是0。然后將這個(gè)掩碼與整數(shù)進(jìn)行按位與操作,就能達(dá)到設(shè)置這些位的目的。
綜上所述,補(bǔ)碼、反碼和掩碼都是計(jì)算機(jī)中數(shù)值表示和處理的重要工具,它們各有特點(diǎn)和應(yīng)用場景。補(bǔ)碼廣泛應(yīng)用于計(jì)算機(jī)中的數(shù)值計(jì)算,反碼在某些特定的數(shù)學(xué)運(yùn)算中有所應(yīng)用,而掩碼則主要用于位操作和特定位的控制。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
C語言代碼實(shí)例代碼解釋原碼反碼補(bǔ)碼
解釋:計(jì)算機(jī)里面進(jìn)行數(shù)值的計(jì)算往往是補(bǔ)碼進(jìn)行計(jì)算,也就是在計(jì)算機(jī)里面進(jìn)行計(jì)算是32位,如果數(shù)值是正整數(shù)的情況下32位的初始位從左到右的第一個(gè)位是0也就是符號位,如果是負(fù)數(shù)的情況下,從左到右初始位也就是符號位是1。
——————————————————————————————————————————————————————————————————————————————————————
進(jìn)制的計(jì)算:
這里拿術(shù)語和畫圖進(jìn)行計(jì)算
二進(jìn)制的計(jì)算
二進(jìn)制計(jì)算是基于計(jì)算機(jī)內(nèi)部采用的二進(jìn)制數(shù)系統(tǒng)來進(jìn)行的。二進(jìn)制數(shù)系統(tǒng)僅使用兩個(gè)數(shù)字:0和1,低位向高位進(jìn)位是逢二進(jìn)一,借一當(dāng)二。在二進(jìn)制中,借一當(dāng)二意味著,當(dāng)某一位上的數(shù)字達(dá)到2時(shí),它將向更高位進(jìn)1,同時(shí),進(jìn)位的1將會被加到下一位的計(jì)算中。
二進(jìn)制計(jì)算包括基本的加法、減法、乘法和除法,以及更高級的運(yùn)算如冪和對數(shù)計(jì)算。以下是一些基礎(chǔ)的二進(jìn)制運(yùn)算的解釋:
1. **二進(jìn)制加法**:
? ?- 類似于十進(jìn)制加法,二進(jìn)制加法也是從最低位(最低有效位)開始相加。
? ?- 如果相加的結(jié)果小于2,則直接寫下來;
? ?- 如果相加的結(jié)果為2或更高,則向前進(jìn)一位,并將剩余的數(shù)值(1或0)寫下來。
? ?- 進(jìn)位會在下一位的計(jì)算中加入。
2. **二進(jìn)制減法**:
? ?- 二進(jìn)制減法類似于加法,不過是通過添加負(fù)數(shù)來實(shí)現(xiàn)的。
? ?- 借一當(dāng)二規(guī)則在這里也適用,不過是從高位向低位借位。
3. **二進(jìn)制乘法**:
? ?- 二進(jìn)制乘法使用類似于十進(jìn)制的乘法算法。
? ?- 每一位乘數(shù)乘以另一個(gè)數(shù)的每一位,然后將結(jié)果相加。
4. **二進(jìn)制除法**:
? ?- 二進(jìn)制除法通過重復(fù)減去除數(shù)的最小倍數(shù)來實(shí)現(xiàn)。
? ?- 這可以通過不斷左移除數(shù)來實(shí)現(xiàn),直到被除數(shù)小于除數(shù)為止。
5. **二進(jìn)制冪運(yùn)算**:
? ?- 計(jì)算二進(jìn)制冪可以通過重復(fù)乘以2來實(shí)現(xiàn),即每次將現(xiàn)有的二進(jìn)制數(shù)左移一位。
6. **二進(jìn)制對數(shù)運(yùn)算**:
? ?- 二進(jìn)制對數(shù)可以通過冪的逆運(yùn)算來計(jì)算。
? ?- 具體來說,可以通過查找2的冪次方表,來確定一個(gè)二進(jìn)制數(shù)是多少次方。
——————————————————————————————————————————————————————————————————————————————————————
畫圖舉例二進(jìn)制和十進(jìn)制之間的關(guān)系:? ? ? ??
我們計(jì)算拿15舉例
首先計(jì)算15轉(zhuǎn)換成二進(jìn)制
15轉(zhuǎn)換成二進(jìn)制
14舉例
14轉(zhuǎn)換成二進(jìn)制
再計(jì)算二進(jìn)制轉(zhuǎn)換成十進(jìn)制
這里是1 1 1 1二進(jìn)制 換算成十進(jìn)制15的數(shù)值
這里是1 1 1 0二進(jìn)制 換算成十進(jìn)制14的數(shù)值
——————————————————————————————————————————————————————————————————————————————————————
畫圖進(jìn)行解釋進(jìn)制的轉(zhuǎn)換關(guān)系
二進(jìn)制和八進(jìn)制之間的互相轉(zhuǎn)化
這里是二進(jìn)制的轉(zhuǎn)換關(guān)系 左邊是十進(jìn)制 右邊是二進(jìn)制
?簡單的說就是二進(jìn)制轉(zhuǎn)換成八進(jìn)制可以進(jìn)行一次三位的計(jì)算
簡單的說就是二進(jìn)制轉(zhuǎn)換成16進(jìn)制可以進(jìn)行一次4位的計(jì)算
這里解釋完二進(jìn)制的計(jì)算,我們繼續(xù)回歸主體,講解原碼反碼補(bǔ)碼。
——————————————————————————————————————————————————————————————————————————————————————
講解原碼反碼補(bǔ)碼:
什么是原碼反碼補(bǔ)碼
這里再贅述一遍
原碼、反碼和補(bǔ)碼是計(jì)算機(jī)中表示有符號整數(shù)的三種不同的編碼方式,主要用于二進(jìn)制數(shù)的表示和運(yùn)算。下面分別解釋這三種編碼方式:
1. **原碼**:原碼是最直觀的一種表示方法,每一位二進(jìn)制數(shù)位都表示一個(gè)數(shù)的二進(jìn)制位。對于正數(shù),原碼和其二進(jìn)制表示相同;對于負(fù)數(shù),原碼在最高位(符號位)為1,其余位表示該數(shù)的絕對值。例如,+0的原碼是00000000,-1的原碼是10000000。
2. **反碼**:反碼用于簡化正負(fù)數(shù)的加減運(yùn)算。對于正數(shù),其反碼與原碼相同;對于負(fù)數(shù),其反碼是將原碼中除符號位外的所有位取反(0變1,1變0)。例如,+0的反碼是00000000,-1的反碼是11111111。
3. **補(bǔ)碼**:補(bǔ)碼也是為了簡化計(jì)算機(jī)中的加減運(yùn)算,特別是減法運(yùn)算。正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是其反碼加1。例如,+0的補(bǔ)碼是00000000,-1的補(bǔ)碼是11111111(反碼是11111111,加1得到11111110,但由于計(jì)算機(jī)通常使用補(bǔ)碼表示負(fù)數(shù),所以通常直接將11111111作為-1的補(bǔ)碼)。
補(bǔ)碼的優(yōu)點(diǎn)在于,它將符號位的概念和數(shù)值的表示統(tǒng)一起來,同時(shí)使得加法和減法運(yùn)算統(tǒng)一化,簡化了計(jì)算機(jī)內(nèi)部的邏輯電路設(shè)計(jì)。在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,補(bǔ)碼是最常用的表示方法。
——————————————————————————————————————————————————————————————————————————————————————
計(jì)算機(jī)是如何計(jì)算的
在計(jì)算機(jī)計(jì)算數(shù)值里面,計(jì)算機(jī)會把數(shù)值計(jì)算成
?這里我們拿代碼進(jìn)行舉例
這里是正數(shù)的數(shù)值 正數(shù)的數(shù)值原碼反碼補(bǔ)碼的數(shù)值是一樣的
這里的數(shù)值是10來進(jìn)行舉例
這里需要知道的是,計(jì)算機(jī)進(jìn)行計(jì)算轉(zhuǎn)換的時(shí)候是把十進(jìn)制的數(shù)值轉(zhuǎn)換成二進(jìn)制,然后把二進(jìn)制計(jì)算成補(bǔ)碼然后進(jìn)行計(jì)算。
正數(shù)的計(jì)算是原碼反碼補(bǔ)碼是一樣的。
負(fù)數(shù)的原碼反碼不一樣是有計(jì)算過程的
是在原碼的基礎(chǔ)上 取反+1
如圖
這里我們需要知道,計(jì)算的時(shí)候數(shù)值是由32位的比特位組成,從右邊向左邊進(jìn)行加減,也就是正常的加減乘除。如果是類型不一樣的情況下,則會進(jìn)行截?cái)?,也就是丟失數(shù)據(jù),下面會進(jìn)行講解。
?計(jì)算機(jī)運(yùn)用符號,按位與或者按位或計(jì)算期間是利用補(bǔ)碼進(jìn)行計(jì)算
計(jì)算完畢之后返回原路 也就是之前是取反+1
補(bǔ)碼計(jì)算完成之后需要 補(bǔ)碼取反+1 變成原碼 呈現(xiàn)給你看
需要知道 32位 最前面的是符號位 0是正數(shù) 1是負(fù)數(shù)
——————————————————————————————————————————————————————————————————————————————————————
下面我們舉兩個(gè)例子
拿這個(gè)來舉例
舉例1:
代碼解釋?
所以-1是最特殊的 32位1?
下面會剖析為什么是32位?

舉例2:
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
操作符的詳解
?1.左移操作符<<
向左移動補(bǔ)的是0
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 6;
int b = a << 1;
printf("%d", b);
return 0;
}
?向左移動一位
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 6; //0000000000 0000000000 000000000 111
int b = a << 1;//000000000 0000000000 000000000 1110
printf("%d", b);
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————
2.右移操作符>>
右移操作符和左移操作符基本上一樣,左移操作符是向左移動補(bǔ)0,右移操作符是向右移動補(bǔ)符號位
移位規(guī)則:首先右移運(yùn)算分兩種:
1.邏輯右移:左邊用填充,右邊丟棄
2,算術(shù)右移,左邊用原該值的符號位填充,右邊丟棄
右移到底是算術(shù)右移,還是邏輯右移是取決于編譯
器的實(shí)現(xiàn),常見的編譯器都是算術(shù)右移
向右移動補(bǔ)的是算數(shù)位
簡單的說就32位的二進(jìn)制的數(shù)字每次右移動(下面會介紹為什么是32位)
之前我們講解了原碼反碼補(bǔ)碼,這里直接上代碼 計(jì)算機(jī)計(jì)算的過程是正數(shù)的原反補(bǔ)一樣,負(fù)數(shù)需要符號位取反,然后除符號位全部取反+1,得到補(bǔ)碼進(jìn)行計(jì)算。計(jì)算完畢后,補(bǔ)碼除符號位之外全部取反+1得到原碼轉(zhuǎn)化成二進(jìn)制進(jìn)行計(jì)算。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 5;
int b = a >> 1;
printf("%d", b);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 5;//轉(zhuǎn)換成補(bǔ)碼是110->000000000 0000000000 0000000000 110
int b = a >> 1;//右移動一位 最左邊補(bǔ)上符號位 也就是 0000000000 0000000000 0000000000 11
printf("%d", b);
return 0;
}
?需要知道a還是5
但是接收a數(shù)值的b則是產(chǎn)生了變化?
這里千萬記住計(jì)算的時(shí)候是先換算成補(bǔ)碼,補(bǔ)碼補(bǔ)碼之間進(jìn)行計(jì)算,然后計(jì)算出的補(bǔ)碼換算成原碼轉(zhuǎn)換成二進(jìn)制。——————————————————————————————————————————————————————————————————————————————————————
3.算數(shù)運(yùn)算符和邏輯運(yùn)算符
按位與&
按位與邏輯是
按位與運(yùn)算符是位運(yùn)算符的一種,它對兩個(gè)操作數(shù)(通常為整數(shù))的每一位進(jìn)行 AND 運(yùn)算。如果兩個(gè)操作數(shù)的相應(yīng)位都為1,則結(jié)果的相應(yīng)位為1,否則為0。
這里千萬記住計(jì)算的時(shí)候是先換算成補(bǔ)碼,補(bǔ)碼補(bǔ)碼之間進(jìn)行計(jì)算,然后計(jì)算出的補(bǔ)碼換算成原碼轉(zhuǎn)換成二進(jìn)制。
——————————————————————————————————————————————————————————————————————————————————————
按位或|
這里千萬記住計(jì)算的時(shí)候是先換算成補(bǔ)碼,補(bǔ)碼補(bǔ)碼之間進(jìn)行計(jì)算,然后計(jì)算出的補(bǔ)碼換算成原碼轉(zhuǎn)換成二進(jìn)制。——————————————————————————————————————————————————————————————————————————————————————
異或^
相同為0 不同為1
再取反 +1
這里取反+1的目的是自己看自己算出來是數(shù)值幾
這里千萬記住計(jì)算的時(shí)候是先換算成補(bǔ)碼,補(bǔ)碼補(bǔ)碼之間進(jìn)行計(jì)算,然后計(jì)算出的補(bǔ)碼換算成原碼轉(zhuǎn)換成二進(jìn)制。——————————————————————————————————————————————————————————————————————————————————————
~波良號 按位取反
對二進(jìn)制數(shù)列 按位取反
11111111111111111111111111111111(這個(gè)數(shù)值是-1 特殊數(shù)值進(jìn)行記憶)
然后這里 依舊是 取反 +1
這里千萬記住計(jì)算的時(shí)候是先換算成補(bǔ)碼,補(bǔ)碼補(bǔ)碼之間進(jìn)行計(jì)算,然后計(jì)算出的補(bǔ)碼換算成原碼轉(zhuǎn)換成二進(jìn)制。
——————————————————————————————————————————————————————————————————————————————————————
4.實(shí)例操作
1.實(shí)現(xiàn)數(shù)值的交換
版本1?
版本2
版本3
異或^
相同為0 不同為1 也就是把第一個(gè)a相互代入 下面的a b
簡單的說就是a^b就是一把鑰匙
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//交換兩個(gè)變量(不創(chuàng)建臨時(shí)變量)
//3
int main()
{
int a = 3; int b = 5;
printf("交換前a = %d b = %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交換后a = %d b = %d", a, b);
}
2
int main()
{
int a = 3; int b = 5;
printf("交換前a = %d b = %d", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("交換后a = %d b = %d", a, b);
}
//
//
//1.創(chuàng)建變量的情況下
int main()
{
int a = 3; int b = 5;
int c = 0;
c = a;
a = b;
b = c;
printf("%d %d", a, b);
}
——————————————————————————————————————————————————————————————————————————————————————
2.求一個(gè)整數(shù)二進(jìn)制里面1的個(gè)數(shù)
版本1
但是這里-1是錯(cuò)誤的也就是 這個(gè)代碼對于負(fù)數(shù)是不正確的
無符號整數(shù)來看待 滿足計(jì)算要求
版本2
版本3
?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-828450.html
執(zhí)行一次去掉一個(gè)1
二進(jìn)制里面的嘴右邊的1 消失
說明執(zhí)行一次去掉1一次
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
3
//int main()
//{
// int input = 0; int count = 0;
// printf("輸入數(shù)值,系統(tǒng)自動計(jì)算二進(jìn)制里面1的個(gè)數(shù):\n");
// scanf("%d", &input);
// while (input)
// {
// input = input & (input - 1);
// count++;
// }
// printf("二進(jìn)制里面1的個(gè)數(shù)是:%d", count);
// return 0;
//}
//
//2
int main()
{
int input = 0; int count = 0;
printf("輸入數(shù)值,系統(tǒng)自動計(jì)算二進(jìn)制里面1的個(gè)數(shù):\n");
scanf("%d", &input);
for (int i = 0; i < 32; i++)
{
if (((input >> i) & 1) == 1)
count++;
}
printf("二進(jìn)制里面1的個(gè)數(shù)是:%d", count);
return 0;
}
//
1
int main()
{
unsigned int input = 0; int count = 0;
printf("輸入數(shù)值,系統(tǒng)自動計(jì)算二進(jìn)制里面1的個(gè)數(shù)。");
scanf("%d", &input);
while (input != 0)
{
if (input % 2 == 1)
count++;
input = input / 2;
}
printf("%d", count);
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————
3.比較二進(jìn)制的個(gè)數(shù)
版本 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
1
//int main()
//{
// unsigned int input1 = 0; unsigned int input2 = 0; int count = 0;
// printf("輸入兩個(gè)數(shù)值,系統(tǒng)自動計(jì)算成二進(jìn)制并且計(jì)算幾個(gè)位不一樣:\n");
// scanf("%d %d", &input1, &input2);
// while (input1 != 0 || input2 != 0)//這里只能是或者 并且的話 缺少條件 或者就是一個(gè)沒有完成 繼續(xù)循環(huán)
// {
// if ((input1 % 2) != (input2 % 2))
// count++;
// input1 = input1 / 2;
// input2 = input2 / 2;
//
// }
// printf("%d", count);
// return 0;
//}
下面還會用實(shí)例兩個(gè)有難度的代碼進(jìn)行剖析
在此之前補(bǔ)充一些知識
包括這個(gè)舉例 用邏輯運(yùn)算符寫出代碼
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
5.操作符的優(yōu)先級和結(jié)合性
優(yōu)先級
這個(gè)是優(yōu)先級,但是計(jì)算好優(yōu)先級不代表可以寫出正確的代碼
優(yōu)先級只是決定優(yōu)先級不同的進(jìn)行先后運(yùn)算
優(yōu)先級相同決定的是結(jié)合性
結(jié)合性是什么 簡單的說就是大部分的運(yùn)算符是從左到右進(jìn)行結(jié)合的
小部分是從右向左
就比如這里 是先計(jì)算5*6 再計(jì)算除以二
——————————————————————————————————————————————————————————————————————————————————————
結(jié)合性
這里也可以通過圓括號進(jìn)行優(yōu)先級的修改
賦值運(yùn)算符的優(yōu)先級是非常低的
——————————————————————————————————————————————————————————————————————————————————————
問題代碼
問題表達(dá)式解釋
1.簡單的說就是么有確定唯一的計(jì)算路徑 這里就是很危險(xiǎn)
這里如果abcef的每一個(gè)的表達(dá)式 并且每一次的表達(dá)式有相同的變量 這里就會導(dǎo)致不能確定唯一的計(jì)算路徑 計(jì)算的結(jié)果是不一樣的
這里的解決辦法是拆開寫 或者加上括號
所以一個(gè)表達(dá)式解決所有的問題是不現(xiàn)實(shí)的
——————————————————————————————————————————————————————————————————————————————————————
2.這里無法確定c是優(yōu)先計(jì)算還是后計(jì)算
——————————————————————————————————————————————————————————————————————————————————————
3.問題代碼
——————————————————————————————————————————————————————————————————————————————————————
4.問題代碼
下面補(bǔ)充一些二進(jìn)制為什么是32位
以及整形提升和算數(shù)轉(zhuǎn)換
下面還會用實(shí)例兩個(gè)有難度的代碼進(jìn)行剖析
在此之前補(bǔ)充一些知識
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
計(jì)算機(jī)里面的二進(jìn)制計(jì)算的32位指的是什么
32位環(huán)境
通常指的是一個(gè)計(jì)算機(jī)系統(tǒng)或操作系統(tǒng)的架構(gòu),其中處理器、內(nèi)存地址以及其他硬件和軟件資源都使用32位二進(jìn)制數(shù)來表示。這意味著該系統(tǒng)可以處理的數(shù)據(jù)量最大為2的32次方(即4,294,967,296)個(gè)不同的值。
在32位環(huán)境中,
處理器的寄存器、內(nèi)存尋址以及其他硬件參數(shù)都是32位的。這影響了系統(tǒng)的地址空間大小、可以處理的數(shù)據(jù)量以及可以同時(shí)運(yùn)行的程序的大小。例如,32位系統(tǒng)上的內(nèi)存地址空間最大為4GB(2的32次方字節(jié)),盡管實(shí)際上由于各種系統(tǒng)開銷,可用內(nèi)存可能少于這個(gè)量。
32位環(huán)境也可以指編譯器或編程語言的執(zhí)行環(huán)境,例如,某些編譯器或編程語言可以在32位操作系統(tǒng)上運(yùn)行,或者專門為32位處理器優(yōu)化。
——————————————————————————————————————————————————————————————————————————————————————
在操作系統(tǒng)方面
32位操作系統(tǒng)是指系統(tǒng)核心以及運(yùn)行在系統(tǒng)上的應(yīng)用程序都是為32位硬件環(huán)境設(shè)計(jì)的。這包括Windows XP、Windows 7等,它們都可以在32位處理器上運(yùn)行。
在編程語言和工具方面,32位環(huán)境可能涉及到匯編語言、C語言、C++等編程語言,以及相關(guān)的開發(fā)工具和庫,它們都是針對32位處理器架構(gòu)的。
這里涉及到一些指針的知識簡單的理解就是
首先,必須理解,計(jì)算機(jī)內(nèi)是有很多的硬件單元,而硬件單元是要互相協(xié)同工作的。所謂的協(xié)同,至少相互之間要能夠進(jìn)行數(shù)據(jù)傳遞
但是硬件與硬件之間是互相獨(dú)立的,那么如何通信呢?答案很簡單,用"線”連起來
而CPU和內(nèi)存之間也是有大量的數(shù)據(jù)交互的,所以,兩者必須也用線連起來
不過,我們今天關(guān)心一組線,叫做地址總線
計(jì)算機(jī)中的編址,并不是把每個(gè)字節(jié)的地址記錄下來而是通過硬件設(shè)計(jì)完成的。
鋼琴、吉他 上面沒有寫上"剁、來、咪、發(fā)、唆、拉西”這樣的信息,但演泰者照樣能夠準(zhǔn)確找到每一個(gè)琴弦的每一個(gè)位置,這是為何?因?yàn)橹圃焐桃呀?jīng)在樂器硬件層面上設(shè)計(jì)好了,并且所有的演奏者都知道。本質(zhì)是一種約定出來的共識!
硬件編址也是如此
32位機(jī)器有62根地址總線,每根線我們可以簡單理解只有兩態(tài),表示0,1[電脈沖有無],那么一根線,就能表示2種含義,2根線就能表示4種含義,依次類推。32就能表示2^32種含義,每一種含義都代表一根地址線個(gè)地址
地址信息被下達(dá)給內(nèi)存,在內(nèi)存上,就可以找到該地址對應(yīng)的數(shù)據(jù),將數(shù)據(jù)在通過數(shù)據(jù)總線傳入CPU內(nèi)寄存器。
簡單說就是每一個(gè)數(shù)值代表一個(gè)信號 比如01代表信號 11代表信號
可以簡單理解為32位就是 2的32次方個(gè)信號?
這里就可以理解為?
——————————————————————————————————————————————————————————————————————————————————————
計(jì)算里面的32位指的是什么
32位通常指的是32位二進(jìn)制數(shù),而不是32位字節(jié)。在計(jì)算機(jī)科學(xué)中,位(bit)是衡量數(shù)據(jù)存儲和處理容量的基本單位,而字節(jié)(byte)是由8位組成的,是計(jì)算機(jī)中常用的數(shù)據(jù)單位。
32位二進(jìn)制數(shù)意味著有32個(gè)獨(dú)立的二進(jìn)制位,每個(gè)位可以是0或1,因此它可以表示2^32(即4,294,967,296)個(gè)不同的值。這32位可以用來表示數(shù)據(jù)、地址或其他信息。
在計(jì)算機(jī)體系結(jié)構(gòu)中,32位處理器意味著處理器可以一次處理32位的數(shù)據(jù)。這32位數(shù)據(jù)通常在處理器內(nèi)部的寄存器中進(jìn)行運(yùn)算。寄存器是CPU內(nèi)部的高速存儲單元,用于存儲指令、數(shù)據(jù)和地址等信息。
總結(jié)來說,32位是指32位二進(jìn)制數(shù),而不是32個(gè)字節(jié)。在計(jì)算機(jī)中,一個(gè)字節(jié)由8位組成,因此32位等于4個(gè)字節(jié)。
——————————————————————————————————————————————————————————————————————————————————————
不同環(huán)境下占據(jù)的不同字節(jié)長度
在計(jì)算機(jī)術(shù)語中,x86和x64通常指的是處理器的指令集架構(gòu),而不是直接指代四個(gè)字節(jié)或八個(gè)字節(jié)。不過,這兩個(gè)術(shù)語確實(shí)與處理器的字長有關(guān),字長決定了處理器可以一次性處理的二進(jìn)制數(shù)據(jù)的位數(shù)。
x86架構(gòu),最初是指32位處理器架構(gòu),它起源于1978年英特爾發(fā)布的8086處理器。隨著時(shí)間的推移,x86架構(gòu)逐漸擴(kuò)展,支持更高級的功能和更大的內(nèi)存尋址空間。x86架構(gòu)的處理器可以處理32位數(shù)據(jù),也就是說,它們一次可以處理32個(gè)二進(jìn)制位的數(shù)據(jù)。
x64架構(gòu),也稱為x86-64或amd64,是在x86架構(gòu)的基礎(chǔ)上擴(kuò)展而來的64位處理器架構(gòu)。它由AMD公司首次提出,并得到了英特爾等公司的支持。x64架構(gòu)的處理器可以處理64位數(shù)據(jù),即一次可以處理64個(gè)二進(jìn)制位的數(shù)據(jù)。
在這里,“四個(gè)字節(jié)”和“八個(gè)字節(jié)”是指數(shù)據(jù)傳輸和存儲的單位。在32位系統(tǒng)中,通常使用的數(shù)據(jù)單位是四個(gè)字節(jié),因?yàn)?2位數(shù)據(jù)正好占用四個(gè)字節(jié)的空間。而在64位系統(tǒng)中,由于處理的位數(shù)增加,通常使用的數(shù)據(jù)單位是八個(gè)字節(jié),即64位數(shù)據(jù)占用八個(gè)字節(jié)的空間。
總結(jié)來說,x86和x64指的是處理器的指令集架構(gòu),而四個(gè)字節(jié)和八個(gè)字節(jié)是指數(shù)據(jù)傳輸和存儲的單位。在32位系統(tǒng)中,一個(gè)字節(jié)由8位組成,因此32位等于4個(gè)字節(jié)。而在64位系統(tǒng)中,一個(gè)字節(jié)仍然由8位組成,但64位數(shù)據(jù)通常占用8個(gè)字節(jié)的空間。
——————————————————————————————————————————————————————————————————————————————————————
指針變量不同環(huán)境下占據(jù)字節(jié)長度
指針變量x86環(huán)境下 占據(jù)的是4個(gè)字節(jié) x64的環(huán)境下占據(jù)的是8個(gè)字節(jié)
——————————————————————————————————————————————————————————————————————————————————————
指針類型
不同指針類型占據(jù)的字節(jié)長度是不一樣的
比如int
在大多數(shù)現(xiàn)代計(jì)算機(jī)系統(tǒng)中,int 類型通常占用 4 個(gè)字節(jié)(32位)的內(nèi)存空間。這意味著一個(gè) int 類型的變量可以存儲 2 的 32 次方,即 4,294,967,296 種不同的值。
然而,這并不是絕對的。在一些舊的或特殊的硬件平臺上,int 可能占用不同的字節(jié)數(shù),例如 2 個(gè)字節(jié)(16位)。此外,在 C99 標(biāo)準(zhǔn)中,int 的大小被定義為至少 16 位,但在 C99 之前的標(biāo)準(zhǔn)中,int 的大小沒有這樣的保證。
在編寫跨平臺的代碼時(shí),如果你想確保 int 類型的大小,可以使用 int32_t 和 int64_t 類型,它們分別代表有 32 位和 64 位的整數(shù)類型,這些類型在 C99 標(biāo)準(zhǔn)中定義在 <stdint.h> 頭文件中。
這里還需要講解一下整形提升和算數(shù)轉(zhuǎn)換
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
什么是整形提升,什么是算數(shù)轉(zhuǎn)換
整形提升
這里需要知道的是計(jì)算機(jī)進(jìn)行計(jì)算的時(shí)候在C語言的編譯器里面除去
?整型提升
C語言中整型算術(shù)運(yùn)算總是至少以缺省整型類型的精度來進(jìn)行的。
為了獲得這個(gè)精度,表達(dá)式中的字符和短整型操作數(shù)在使用之前被轉(zhuǎn)換為普通整型,這種轉(zhuǎn)換稱為整型提升。
整型提升的意義:
表達(dá)式的整型運(yùn)算要在CPU的相應(yīng)運(yùn)算器件內(nèi)執(zhí)行,CPU內(nèi)整型運(yùn)算器(ALU)的操作數(shù)的字節(jié)長度一般就是int的字節(jié)長度,同時(shí)也是CPU的通用寄存器的長度。
因此,即使兩個(gè)char類型的相加,在CPU執(zhí)行時(shí)實(shí)際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長度。
通用CPU (eneral-purpose CPU) 是難以直接實(shí)現(xiàn)兩個(gè)8比特字節(jié)直接相加運(yùn)算 (雖然機(jī)器指中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長度可能小于int長度的整型值,都必須先轉(zhuǎn)換為int或unsigned int,然后才能送入CPU去執(zhí)行運(yùn)算。
舉例
進(jìn)行解釋的意思就是
這里面的是char的類型 小于整形的類型 進(jìn)行整形提升
char存放一個(gè)字節(jié) 也就是八個(gè)比特位
然后ab進(jìn)行整形提升
高位補(bǔ)0 把除 一個(gè)字節(jié) 八個(gè)比特位之外的補(bǔ)滿32位
但是此時(shí)char只有一個(gè)字節(jié) 也就是八個(gè)比特位 然后再對其進(jìn)行八個(gè)比特位 一個(gè)字節(jié)之外的進(jìn)行截?cái)?/strong>
但是這里是整形的打印%d
打印的時(shí)候也是會進(jìn)行整形提升的
但是此時(shí)char的最高位是1
進(jìn)行整形轉(zhuǎn)換 char轉(zhuǎn)換成int 補(bǔ)滿32位
補(bǔ)滿 11111111111111111
但是計(jì)算機(jī)的計(jì)算是補(bǔ)碼計(jì)算的 然后取反+1
這里需要知道 計(jì)算的結(jié)果 和所有計(jì)算的過程都是補(bǔ)碼 只有計(jì)算打印出來的結(jié)果才是原碼
關(guān)于char的講解
這里為什么是
簡單說 就是提升取決于編譯器環(huán)境是32位還是64位,而不是類型
——————————————————————————————————————————————————————————————————————————————————————
算數(shù)轉(zhuǎn)換
簡單的說就是向上轉(zhuǎn)換的形式進(jìn)行轉(zhuǎn)換 被稱為算數(shù)轉(zhuǎn)換
如果某個(gè)操作符的各個(gè)操作數(shù)屬于不同的類型,那么除非其中一個(gè)操作數(shù)的轉(zhuǎn)換為!一個(gè)操作數(shù)的類型,否則操作就無法進(jìn)行。下面的層次體系稱為導(dǎo)常算術(shù)轉(zhuǎn)換。
1 long double
2 double
3 float
4 unsigned long int
5 long int
6 unsigned int
7 int
如果某個(gè)操作數(shù)的類型在上面這個(gè)列表中排名靠后,那么首先要轉(zhuǎn)換為另外一個(gè)操
數(shù)的舉型后執(zhí)行運(yùn)管
簡單的說就是向上轉(zhuǎn)換的形式進(jìn)行轉(zhuǎn)換 被稱為算數(shù)轉(zhuǎn)換
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
上述內(nèi)容舉例代碼和具體的應(yīng)用:
結(jié)合性實(shí)例1:
單身狗1
找出 出現(xiàn)一次的數(shù)字
在一個(gè)整型數(shù)組中,只有一個(gè)數(shù)字出現(xiàn)一次,其他數(shù)組都是成對出現(xiàn)的,請找出那個(gè)只出現(xiàn)一次的數(shù)字。
例如:
數(shù)組中有:1 2 3 4 5 1 2 3 4,只有5出現(xiàn)一次,其他數(shù)字都出現(xiàn)2次,找出5
單身狗1
找出 出現(xiàn)一次的數(shù)字
異或 相同為o 不同為1
所以
這里可以理解成加等于 同理異或也是一樣?
這是從0開始異或 0異或任何數(shù)字都是數(shù)字本身
代碼
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[] = { 1,2,3,1,2 };
int len = sizeof(arr) / sizeof(arr[0]);
int sum = 0;
for (int i = 0; i < len; i++)
{
sum ^= arr[i];
}
printf("%d", sum);
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————
結(jié)合性實(shí)例2:
打印二進(jìn)制里面的奇偶數(shù)位
獲取一個(gè)整數(shù)二進(jìn)制序列中所有的偶數(shù)位和奇數(shù)位,分別打印出二進(jìn)制序列
打印二進(jìn)制里面的奇偶數(shù)
?
判斷是1還是0
?
內(nèi)存的最小劃分是字節(jié) 不能是比特位
?//這里還需要注意一點(diǎn)就是 為什么不是32 而是30 或者31而是因?yàn)閿?shù)值在計(jì)算的時(shí)候首位已經(jīng)計(jì)算,右移操作符右移動的時(shí)候是不能越界的,如果i==32的話進(jìn)行計(jì)算的時(shí)候是容易超過最后一位的
代碼1(上面的是代碼1 的講解)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Printbit(int num)
{
for (int i = 31; i >= 1; i -= 2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
for (int i = 30; i >= 0; i -= 2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
}
int main()
{
int num = 14;
Printbit(num);
return 0;
}
代碼2
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//打印整數(shù)二進(jìn)制的奇數(shù)位和偶數(shù)位
int main()
{
int i = 0; int count = 0;
printf("輸入十進(jìn)制,系統(tǒng)打印整數(shù)二進(jìn)制的奇數(shù)位和偶數(shù)位:");
scanf("%d", &i);
for (int j = 0; j < 32; j++)
{
if (((i >> j) & 1) == 1 || ((i >> j) & 1) == 0)
{
count++;
if (count % 2 == 0)
{
printf("偶數(shù)位:%d\n", (i >> j) & 1);
}
else
{
printf("奇數(shù)位:%d\n", (i >> j) & 1);
}
}
}
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————
整形提升的實(shí)例講解1
?
short類型的指針每次解引用只會修改兩個(gè)字節(jié)
類型不一樣 自然會進(jìn)行強(qiáng)制類型的轉(zhuǎn)換
——————————————————————————————————————————————————————————————————————————————————————
整形提升的實(shí)例講解2
這這里是有符號數(shù)據(jù)和無符號數(shù)據(jù)進(jìn)行整形提升 編程無符號數(shù)據(jù)
文章來源:http://www.zghlxwxcb.cn/news/detail-828450.html
?
到了這里,關(guān)于C語言操作符篇章+系統(tǒng)講解分析+深入理解操作符+原反補(bǔ)結(jié)合的具體應(yīng)用+根源進(jìn)行講解+進(jìn)制轉(zhuǎn)換+操作環(huán)境+實(shí)例剖析+上萬字+百張圖片精細(xì)化講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!