强制类型转换问题
在c++中,當(dāng)把一個(gè)表示范圍更大的類型的數(shù)值a賦值給一個(gè)表示范圍更小的類型時(shí),會(huì)自動(dòng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)化為范圍表示更大的類型。
轉(zhuǎn)換的規(guī)律是,這里假定較小的類型表示的數(shù)值的個(gè)數(shù)為n。轉(zhuǎn)化后的值為a模n后的余數(shù)。
對(duì)于整型數(shù)a,b來說,取模運(yùn)算或者求余運(yùn)算的方法都是:
1.求 整數(shù)商: c = a/b;
2.計(jì)算模或者余數(shù): r = a - c*b. 求模運(yùn)算和求余運(yùn)算在第一步不同: 取余運(yùn)算在取c的值時(shí),向0 方向舍入(fix()函數(shù));而取模運(yùn)算在計(jì)算c的值時(shí),向負(fù)無窮方向舍入(floor()函數(shù))。 例如:計(jì)算-10 Mod 4?那么:a = -10;b = 4; 第一步:求整數(shù)商c,如進(jìn)行求模運(yùn)算c = -3(向負(fù)無窮方向舍入),求余c = -2(向0方向舍入); 第二步:計(jì)算模和余數(shù)的公式相同,但因c的值不同,求模時(shí)r = 2,求余時(shí)r = -2。 歸納:當(dāng)a和b符號(hào)一致時(shí),求模運(yùn)算和求余運(yùn)算所得的c的值一致,因此結(jié)果一致。 當(dāng)符號(hào)不一致時(shí),結(jié)果不一樣。求模運(yùn)算結(jié)果的符號(hào)和b一致,求余運(yùn)算結(jié)果的符號(hào)和a一致。 另外各個(gè)環(huán)境下%運(yù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對(duì)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(看上去絕對(duì)值比u小)
i取余的4294967296-9=4294967287
所以結(jié)果為4294967287+10=4294967297,超過了2^32,所以結(jié)果為4294967297對(duì)2^32取余,結(jié)果為1。
?
當(dāng)無符號(hào)數(shù)進(jìn)行減法運(yùn)算時(shí),實(shí)際上是按有符號(hào)進(jìn)行運(yùn)算,然后類型轉(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 }第一個(gè)輸出毫無疑問為2。
第二個(gè)輸出按有符號(hào)為-2,轉(zhuǎn)化為unsigned后的值為4294967296-2=4294967294。
轉(zhuǎn)載于:https://www.cnblogs.com/wktwj/p/4419758.html
總結(jié)
- 上一篇: 专业视频压制神器下载——解决会声会影、P
- 下一篇: MSP430G2553 移植 Conti