再談c++型別轉換
今天在研究字元編碼的時候偶然想到一個問題,在ansi編碼中,一箇中文字元是用兩個位元組表示的,但是一個char是一個位元組,那麼如果我將一箇中文字元賦值給一個char變數的話,列印輸出會發生什麼情況呢?
試了一下,發現亂碼,意料之中,顯然計算機還是把這個中文字元拆成了兩半,把其中的一般賦值給了變數a,那麼賦給它的到底是哪一半呢?
試一下便知道了,中文字元‘你’的十六進位制編碼是C4 E3,那麼按照下面程式輸出結果為:
char a = '你';
cout<<(int)a;
輸出結果為-29,計算E3的結果和該結果相同,那麼我們推測選取的是後一半。再用‘我’進行驗證。C4 D2,結果為-46,猜想正確。
其實在上面的程式中發生了兩次轉換,第一次是把你這個字元拆成兩半,把後一半賦值給a,第二次由於a是一個位元組而int是四個位元組,那麼需要在a前面補零以達到四個位元組的長度。
那麼如果將int賦值給char變數,擷取的是不是也是後一段呢?由下面的程式可以看出:
int b = 7898;
char c = b;
cout<<(int)c;
程式結果為-38,而7898的二進位制編碼為1111011011010,研究其後八位,發現其結果一致,所以計算機截圖的還是後面八位,而不是前面的八位。
所以我們現在便可以想到,計算機在擷取的時候總是在後面擷取而不是在前面擷取。
但是在計算機中浮點數的表示卻有點複雜,那麼計算機在由浮點數轉換為其他型別時也是不一樣的。例如由浮點數轉換為int整數,那麼計算機擷取的是整數部分,而不是後32位。那麼浮點數轉換為char型的呢?
double aa = 3000.9;
char te = aa;
cout<<endl<<(int)te;
結果為-72,剛好為3000的二進位制表示結果,經過多次驗證,發現其實浮點數轉換為char型是先轉換為int型,再由int型轉換為char型的。
更多型別轉換,請繼續關注本部落格。
相關文章
- C++型別轉換C++型別
- c++ 型別轉換C++型別
- C++ 常型別轉換C++型別
- 【C++】C++之型別轉換C++型別
- C++中的向上型別轉換和向下型別轉換C++型別
- 談談 MySQL 隱式型別轉換MySql型別
- C++強制型別轉換C++型別
- C++ 動態型別轉換C++型別
- C++基本資料型別及型別轉換C++資料型別
- 淺談JavaScript的型別轉換JavaScript型別
- C++ 型別轉換(conv.)C++型別
- C++ 的強制型別轉換C++型別
- C++隱式類型別轉換C++型別
- C++隱式型別的轉換C++型別
- C++ 隱式類型別轉換C++型別
- C C++ 強制型別轉換C++型別
- C++ 重解釋型別轉換C++型別
- C++整理18_型別轉換_C++型別
- C++型別轉換建構函式C++型別函式
- C++ 表示式中的型別轉換C++型別
- c++四種強制型別轉換C++型別
- PHP 型別轉換&&型別強制轉換PHP型別
- 【C++注意事項】1 資料型別及型別轉換C++資料型別
- java型別轉換與強制型別轉換(轉)Java型別
- c++隱式型別轉換存在的陷阱C++型別
- c++ static_cast顯式型別轉換C++AST型別
- 型別轉換型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- C++ 中四種強制型別轉換的區別C++型別
- 資料型別,型別轉換資料型別
- 徹底理解c++的隱式型別轉換C++型別
- 聊聊 C++ 中的四種型別轉換符C++型別
- NodeJS 和 C++ 之間的型別轉換NodeJSC++型別
- C++ 型別轉換詳解 -- const_castC++型別AST
- C++型別轉換時定義非成員函式(轉)C++型別函式
- 淺談 Go 型別轉換之間的那些事Go型別
- 淺談Go型別轉換之間的那些事Go型別
- js型別轉換JS型別