這種知識點,用於什麽地方呢?在串行通訊程序中,若你並不知道對方的字節序是什麽的時候,必須先發送自己的協議給對方,好讓對方正確解析你的數據,因爲串行數據是逐個字節傳送的,你的0xABCD到對方那裏,可能被理解爲0xCDAB。歸根到底,是作者教人不走正路,以“強制類型轉換”玩數據造成的問題,把一個int數據自作聰明地賦値給char數據,讓後者取尾字節爲結果,但正如前述,哪頭在末是説不定的,那麽,你寫出這樣的代碼,會在某種環境下出現問題,而你甚至不知道是這裏的原因,因爲大多時候你的結果都是“對”的。根本就不是char和int的問題,其實是所有不同尺寸數據類型的賦値都有這種問題。爲什麽C++要讓程序員寫很繁瑣的類型轉換格式(static_cast)呢?就是要你明確告訴編譯器,這種轉換是你的真實願望,後果自負,即你已經考慮過相關問題了——C可以隨意轉換數據類型,雖然是靈活方便,但帶來的風險也往往是不自知的。
書上不講這樣的東西,不知道的人反而不會出錯,講了之後,他可能無法藏技要拿出來用一番,結果是給自己挖坑。編程業中有一句箴言大意是這樣的,“有時不知道的細節反而是對你的保護”,沒碰過釘子的人,絶不讚同這句話,他們覺得瞭解越多底層的細節是越牛掰,還要時刻想著怎麽那這些細節秀到代碼中,否則別人不知道你知道那麽深入的東西。
多(含不定)字節字符,其數據類型是wchar_t,文字常量是用L前綴標誌的,如L'A'、L'啊'。ANSI編碼的字符,永遠祗按8位二進制長度解析,ANSI編碼下的中文字符,由2個單字符組合而成,是字符數組。Unicode-16編碼下的wchar_t字符,真的是short int,所以把short int賦値給wchar_t是沒問題的,但把short int賦値給char卻一定有問題。
16位機下,'AB'被暫存爲2字節字符數組,是有序的,當它被解析(賦値)爲16位int的時候,結果取決於當前機器的字節序,高低位可能互換('A' * 256 + 'B'或'B' * 256 + 'A'),沒有正確答案,故強制轉換爲char後的結果,可能是'A'也可能是'B'。intel機器是高位在後,故截得的低位字符是'A'。