用 int 類型表示多個字母,把多個字母轉化為整數的原理是什麼?

在看書時看到的,講的是

定義一個字元常量"FATE",即把4個獨立的8位ASCII碼儲存在一個32位儲存單元中。如果把這樣的字元常量賦給一個char類型變數xxx,xxx的值為"E"。

我出於好奇嘗試了把"FATE"用十進位整數表示出來,數值是1178686533

為什麼會這樣啊?這個值太大了,我把"F","A","T","E"的值互相乘起來最後的值也只有八位數,我想知道"FATE"經過了怎樣的運算最後得出了上面那個十位數,請求指教!


你用十六進位就很容易了解了。


#include &

int main() {
union {
char c[4];
int i;
}u;
u.c[0] = "F";
u.c[1] = "A";
u.c[2] = "T";
u.c[3] = "E";
printf("%08X
", u.i);
}

補充一句:結果是與機器位元組序(endianness)相關的,不同CPU架構有不同結果。


讓我想起上 @孫志崗 老師的C語言課。

學期末答疑,我問了個類似的問題。他沒有回答,而是說『看你這麼聰明的樣子,這個問題應該很容易想明白啊!』

在後來漫長的歲月里,因為不確定什麼才是正確答案,這個問題總會在不同的語言場景下冒出來,想一想,經常有一些新的收穫。

所以有些時候老師不告訴答案也許是更好的,你只需要誇ta,看起來很聰明機靈之類的……

不過後來他就沒有當老師了。

這事得有十年了吧。


你前邊的課肯定沒學會!


各位都說了原理,我來貼段代碼吧。是C++,編譯命令:g++ filename.cpp -std=c++11

#include &
#include &

int main()
{
std::array& fate = {"F","A","T","E"};
std::uint32_t result = 0;
for(auto i = fate.begin(); i != fate.end(); i++)
{
result &<&<= 8; result |= *i; } std::cout &<&< result &<&< std::endl; return 0; }


FATE 的 ascii 碼分別是 46, 41, 54, 45

把這四個十六進位數串接起來,再轉換成十進位,就是 1178686533

(ps,「串接」的方法取決於機器的大小端,這裡假設機器採用小端法)


題主錯在不該把四個字元相乘,而應該把這四個字元對應的ASCII碼按照一位元組為基底,分別乘2563,2562,2561,1再相加就是這個數


當你把這4個位元組看做一個int去解讀時(在大端情況下)第一個位元組就會成為最高的8位,第四個位元組則會成為最低的8位。弄清楚你的平台是大端還是小端之後,將4個char的值轉換成二進位,然後再將4個8位的2進位數按照下面的順序合成一個32位的數,再轉換成十進位,就會得到1178686533。

拼接順序:如果是大端,那麼4個位元組拼接的順序應當是:第一個位元組 第二個位元組 第三個位元組 第四個位元組,如果是小端,那麼相反。

如果還是不明白,那麼舉一個十進位的簡單的例子,假設你有4個數字,12、34、56、78,當你把它們合在一起去看待時,會成為12345678,而不是12*34*56*78 = 1782144。


"FATE"在計算機中的二進位表示為:

00101111 00101001 00110110 00101110

char類型一般佔1個位元組

int類型一般佔4個位元組

把四個位元組的字元常量賦給char類型的變數,自然只能識別最後一個位元組,輸出的話也是只能輸出最後一個位元組,把最後一個位元組的二進位數轉變為十進位數為45,由於是char類型,所以要按照ASCII 45表示的字元"E",輸出字元。

把四個位元組的字元常量賦值給int類型的變數,在計算機中實際是把32位的二進位代碼段賦給變數了,輸出時把這4個位元組的二進位數轉換成十進位的數,由於是int類型,所以直接輸出十進位2^29+2^27+·····+2^3+2^2+2=1178686533


學完計算機組成原理應該就懂了。


Multi-character constant is discouraged.

Multi-character constant warnings

What do single quotes do in C++ when used on multiple characters?


十進位1178686533用16進位表示是46 41 54 45,」FATE"四個字母用ASCII表示就分別是46、41、54、45。你把它轉換為char之後是E是因為char只有8個位,而那個數字有32個位,char只取了45那8位。把字元串用數字表示只是把這段內存用數字類型讀出來而已,你樂意的話還可以把它轉換成你各種想要的類型,甚至是一個指針。


推薦閱讀:

為什麼說C++不是C的超集?
函數傳遞引用 與 直接操縱全局變數 消耗資源的區別?
C語言里64位程序long類型的變數 長度是4還是8?
C++ 完全兼容 C 語言嗎?
C Primer Plus第五版的練習題答案能找到官方正版的嗎?

TAG:編程 | C編程語言 | ASCII |