算數運算子

2021-10-03 10:20:26 字數 3330 閱讀 1445

算數運算是值數值型別進行的值的運算,數值型別包括整數型別、浮點數型別以及被識別為這兩種型別的字面量。資料型別決定了該變數或者字面量能進行哪些運算、如何進行運算。而使用運算子則是要對該運算元實際進行該運算,如果是該型別支援的運算子則能得到對應的結果,否則編譯出錯。

除了陣列,之前提到的所有資料型別歸根結底只是整數和浮點數,而整數和浮點數最常進行的運算就是算數運算。

c/c++提供了多種算數運算子:

運算子作用

+兩個運算元相加 ,得到和

-兩個運算元相減 ,得到差

*兩個運算元相乘 ,得到積

/兩個運算元相除 ,得到商

%兩個運算元相除,得到餘數

++運算元自增1

–運算元自減1

運算元能進行哪些運算、具體如何運算、運算的結果是何種型別,這都是由參與運算的運算元決定的。

兩個整數之間可以進行加、減、乘、除、取餘、自加、自減。

運算的結果是運算元中寬度較大的運算元的型別(小寬度運算元先擴充套件)、signed和unsigned型別同時參與運算則結果為unsigned型別,如果結果超出較大的資料寬度也不會自動擴充套件。對於加法和減法,這樣的規則可能會導致結果溢位,例如:

unsigned

long a =

4294967295

;int b =1;

unsigned

long us = a + b;

// us中存放0x 00 00 00 00

因為unsigned long佔4位元組,4294967295為0x ff ff ff ff,int型別的1擴充套件為0x 00 00 00 01,二者相加結果為0x 01 00 00 00 00由於不會自動擴充套件,仍為4位元組,所以僅僅保留了低位。

檢視反彙編,與分析結果一致:

同樣地,也不會自動縮小資料寬度:

long

long a =

4294967296

;int b =1;

long

long us = a - b;

// us 中存放0x00 00 00 00 ff ff ff ff

// 如果用unsigned接收該結果則會截斷高位保留低位

減法運算實際上是a中二進位制串加上b中二進位制串的補碼,通過反彙編可以檢視,乙個8位元組的數要使用兩次sub指令分別對高位元組和低位元組運算:

加法和減法要注意溢位問題,乘法和除法也要注意。同時除法要避免除0錯誤,並且兩個整數不能整除時結果只保留商的整數部分,因為結果的型別必定是二者之一不會是浮點數,例如:

int a =10;

int b =3;

float us = a / b;

// a / b的結果仍然是int型別,只保留整數部分3,us的值為3.0

除此之外,任何被識別為整數的字面量也可以與整數一樣進行算數運算,例如:

int a =10;

int b =10+

'a';

// 加a的ascii碼值

// 雖然字串字面量的值是整數型的位址,但只能和整數做加法,不能進行其他運算

前面提到,浮點數的儲存大多數是不精確的,也就是實際儲存的值和賦值給變數的字面值不一定完全相等,存在精度的損失。

兩個浮點數之間運算,結果也是二者資料寬度較大的型別。double和long double運算時結果是long double。

浮點數的運算也會溢位只是超出浮點數的表示範圍,而不是二進位制串被截斷,因為浮點數本身就是按照ieee編碼規則儲存的二進位制串,指數和尾數部分結合表示浮點數,即使是4位元組的float型別可以儲存很大或很小的浮點數。

浮點數運算仍然會有精度的損失,因為兩個浮點數本身會損失精度、運算的結果可能再次損失精度。

整數和浮點數運算,其結果一定是運算元中浮點數的型別。

即使是long long型別的整數和float型別的浮點數運算,其結果仍然會是4位元組的float而不是8位元組的long long或double。

修改之前整數除法的例子:

10/3

;// 結果為int型別3

10.0/3

;// 結果為double型別3.3...10/

3.0f

;// 結果為float型別3.3...

自增自減運算子只需要乙個運算元,對運算元自身進行加1或減1。這個運算元必須時可改變的值(變數),可以是整數變數也可以是浮點數變數。

自增自減運算子作用於運算元左邊和運算元右邊在某些情況下的作用是不同的,例如:

如果單獨使用,則在左邊和右邊效果相同:

int a =10;

a++;

int a =10;

++a;

結果都是將a自增1,a最終的值為11。

如果將自增自減這個表示式參與運算或賦值,則左右有區別:

int a =10;

int b =10;

int aa =

++a;

// a先自增為11,再賦值給aa,aa的值為11

int bb = b++

;// b先賦值給bb值為10,b的值再自增為11

檢視反彙編:

二者只是賦值和自增的先後順序不同,通常可理解為若自增自減表示式參與運算或賦值,則在左邊先自增自減然後用變化後的值參與運算或賦值,在右邊則先用原值參與運算或賦值再進行自增自減。

特別注意,只有變數才能使用自增自減運算子,對常量使用則報錯:

10++;

++10

;// 表示式必須是可修改的左值

取餘運算子只能用於兩個整數之間(可以是正整數、負整數或0),如:

5%2

;//值為1-5

%-2;

//值為-15%

-2;//值為1-5

%2;//值為-10%

2;//值為00%

-2;//值為02%

0;// 除0錯誤

餘數的符號和前面被除數的符號一致

算數運算子

計算機,顧名思義就是負責進行數學計算並且儲存計算結果的電子裝置 目標算術運算子的基本使用 01.算數運算子 算數運算子是運算子的一種 是完成基本的算術運算使用的符號,用來處理四則運算 運算子描述例項 加10 20 30 減10 20 10 乘10 20 200 除10 20 0.5 取整除返回除法的...

算數運算子

算數運算子 二元運算子 int a 10 int b 20 int c 25 int d 25 system.out.println a b system.out.println a b system.out.println a b system.out.println a double b 這裡如...

算數運算子

1.算術運算子 前 後 前 後 典型 除號 int num1 12 int num2 5 int result1 num1 num2 system.out.println result1 2 int result2 num1 num2 num2 system.out.println result2 ...