在日常生活中,我們知道,加上乙個負數,等於減去這個負數的絕對值。
那麼在c++裡,是否和我們平時的認知是一樣的呢?
看一段小**:
int i=-42;
unsigned j=10;
std::cout這個**的輸出結果是什麼呢?
和平時的答案不太一樣吧。下面就來**一下原因。
因為在機器中,所有的data都是由二進位制數來儲存,所以此時先將-42轉換為二進位制數。
這時要注意,int型在機器裡是32位儲存,所以此時,在101010前面還有25個0,然後第一位是乙個1,代表是負數。
所以,此時的-42完全轉換為int的二進位制形式是:10000000000000000000000000101010.
然後再取反碼:除符號位外,其餘位取反,即為:11111111111111111111111111010101.
再取補碼:在反碼的基礎上+1,即為: 11111111111111111111111111010110.
好了,處理完int型,現在處理unsigned型。
已知unsigned型為10,則轉化為二進位制是:
同理,此時前面均為0,所以其二進位制就是1010.
現在兩個數都處理完了,接下來進行加和。
11111111111111111111111111010110 + 1010
根據二進位制逢二進一,可以得出結果為: 11111111111111111111111111100000
化成十進位制,既得到結果。
由此可知:
1.機器中儲存負數是儲存其補碼,要掌握補碼計算過程;
2.int型數化unsigned型數的方法過程;
3.計算機中的基本編譯儲存原理。
c語言int型和char型的自動型別轉換
char a 1 機器碼為0xff unsigned char b 254 機器碼0xfe if a b else 上述 輸出結果 a b 賦值用機器碼寫入記憶體 雖然我們以十進位制為兩個變數賦值,但是變數值在記憶體中是以二進位制機器碼的形式存在。如果十進位制數是負數,它就以補碼的形式存放在記憶體中...
有符號型別與無符號型別之間的轉換
void foo void unsigned int a 6 int b 20 a b 6 puts 6 puts 6 printf b x n b b 0xffffffec 這個問題測試你是否懂得c語言中的整數自動轉換原則 這無符號整型問題的答案是輸出是 6 原因是當表示式中存在有符號型別和無符號...
C 中int型與string型互相轉換
include 使用c 標準庫的string類時 using namespace std 同上 include include include 要將string類和int型別直接轉換最好有這些包含,因為自己寫乙個轉換函式比較方便,函式定義參考如下 string getstring const int...