强制类型转换问题
在c++中,當(dāng)把一個表示范圍更大的類型的數(shù)值a賦值給一個表示范圍更小的類型時,會自動進行強制類型轉(zhuǎn)換,轉(zhuǎn)化為范圍表示更大的類型。
轉(zhuǎn)換的規(guī)律是,這里假定較小的類型表示的數(shù)值的個數(shù)為n。轉(zhuǎn)化后的值為a模n后的余數(shù)。
對于整型數(shù)a,b來說,取模運算或者求余運算的方法都是:
1.求 整數(shù)商: c = a/b;
2.計算?;蛘哂鄶?shù): r = a - c*b. 求模運算和求余運算在第一步不同: 取余運算在取c的值時,向0 方向舍入(fix()函數(shù));而取模運算在計算c的值時,向負無窮方向舍入(floor()函數(shù))。 例如:計算-10 Mod 4?那么:a = -10;b = 4; 第一步:求整數(shù)商c,如進行求模運算c = -3(向負無窮方向舍入),求余c = -2(向0方向舍入); 第二步:計算模和余數(shù)的公式相同,但因c的值不同,求模時r = 2,求余時r = -2。 歸納:當(dāng)a和b符號一致時,求模運算和求余運算所得的c的值一致,因此結(jié)果一致。 當(dāng)符號不一致時,結(jié)果不一樣。求模運算結(jié)果的符號和b一致,求余運算結(jié)果的符號和a一致。 另外各個環(huán)境下%運算符的含義不同,比如c/c++,java 為取余,而python則為取模。 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 unsigned u=10; 6 int i=-11; 7 cout<<u+i<<endl; 8 return 0; 9 }2^32=4294967296,i對4294967296取余得4294967296-11=4294967285
所以結(jié)果為4294967285+10=4294967295
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 unsigned u=10; 6 int i=-9; 7 cout<<u+i<<endl; 8 return 0; 9 }如上代碼,所不同的是,int的值改為-9(看上去絕對值比u小)
i取余的4294967296-9=4294967287
所以結(jié)果為4294967287+10=4294967297,超過了2^32,所以結(jié)果為4294967297對2^32取余,結(jié)果為1。
?
當(dāng)無符號數(shù)進行減法運算時,實際上是按有符號進行運算,然后類型轉(zhuǎn)換
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 unsigned u1=12,u2=10; 6 cout<<u1-u2<<endl; 7 cout<<u2-u1<<endl; 8 return 0; 9 }第一個輸出毫無疑問為2。
第二個輸出按有符號為-2,轉(zhuǎn)化為unsigned后的值為4294967296-2=4294967294。
轉(zhuǎn)載于:https://www.cnblogs.com/wktwj/p/4419758.html
總結(jié)
- 上一篇: 专业视频压制神器下载——解决会声会影、P
- 下一篇: 使用IAR开发CC2530遇到的两个问题