强制类型转换问题
在c++中,當把一個表示范圍更大的類型的數值a賦值給一個表示范圍更小的類型時,會自動進行強制類型轉換,轉化為范圍表示更大的類型。
轉換的規律是,這里假定較小的類型表示的數值的個數為n。轉化后的值為a模n后的余數。
對于整型數a,b來說,取模運算或者求余運算的方法都是:
1.求 整數商: c = a/b;
2.計算模或者余數: r = a - c*b. 求模運算和求余運算在第一步不同: 取余運算在取c的值時,向0 方向舍入(fix()函數);而取模運算在計算c的值時,向負無窮方向舍入(floor()函數)。 例如:計算-10 Mod 4?那么:a = -10;b = 4; 第一步:求整數商c,如進行求模運算c = -3(向負無窮方向舍入),求余c = -2(向0方向舍入); 第二步:計算模和余數的公式相同,但因c的值不同,求模時r = 2,求余時r = -2。 歸納:當a和b符號一致時,求模運算和求余運算所得的c的值一致,因此結果一致。 當符號不一致時,結果不一樣。求模運算結果的符號和b一致,求余運算結果的符號和a一致。 另外各個環境下%運算符的含義不同,比如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
所以結果為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
所以結果為4294967287+10=4294967297,超過了2^32,所以結果為4294967297對2^32取余,結果為1。
?
當無符號數進行減法運算時,實際上是按有符號進行運算,然后類型轉換
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,轉化為unsigned后的值為4294967296-2=4294967294。
轉載于:https://www.cnblogs.com/wktwj/p/4419758.html
總結
- 上一篇: 专业视频压制神器下载——解决会声会影、P
- 下一篇: 使用IAR开发CC2530遇到的两个问题