簡體   English   中英

為什么編譯器可以在C ++中將char轉換為int?

[英]Why can a compiler convert char to int in C++?

通過使用Java編程以及現在使用C ++進行編程,我發現您可以將char轉換為int ,然后將int轉換為double

我想知道為什么可以將char轉換為int

在C ++中,它們沒有分配給它們相同數量的內存, char是8位,而int是32位。 那么這是如何工作的呢?

這就是編譯器的設置方式嗎? 我只想要一個解釋。

感謝您提供的所有幫助!!

在某些體系結構上, char可以容納的每個值, int也可以容納。 因此,如果您有一個char ,則可以通過賦予intchar相同的值來使用它來初始化int 這並不奇怪。

在其他架構上,情況並非如此。 C ++仍然允許將任何整數類型轉換為任何其他整數類型。 這必須是正確的,因為在C中也允許它,但是您可以使用大括號初始化來防止這種“縮小”的轉換。

我認為您所關心的-(對於任何體系結構都應考慮的)-是將一個char並“傳遞給它”作為int 但這不是將char轉換為int作用。 就是使用reinterpret_cast轉換為int& 這種轉換是危險的,並可能觸發不確定的行為; 不僅因為intchar不具有相同的大小,還因為它們即使具有相同的大小也可能不具有相同的表示形式。

根據C ++標准,數字類型之間的提升是合法的。 意味着,此功能是C ++語言的一部分。

專門針對您所涉及的促銷,可以將char提升為int並將int提升為double而不損失精度,因為該標准保證:

sizeof(char) <= sizeof(int) <= sizeof(double)

也就是說, char表示的值的范圍肯定包含在int表示的值的范圍內,而int表示的值范圍肯定包含在double所支持的值的范圍內。

凍結的歷史。 C ++基於C,但仍然幾乎將C作為適當的子集。 在1970年代,當C語言被開發出來時, 字節字符之間沒有太大的區別:幾乎所有(如果不是絕對的話),主要的文本編碼每個字符使用一個字節。

在現代C ++ char及其兩個變體中, unsigned charsigned char只是基本字節類型,其中字節被定義為內存的最小可尋址單位,當用於字符時, char只是基本編碼單位(例如,使用UTF- 8個字符由1到5個字節(我認為是字節)組成。

自從1998年(包括該標准化工作)以來,C ++已經獲得了另外三種專用的字符類型: wchar_tchar16_tchar32_t ,但不幸的是,沒有強類型的字符類型。


編譯器選項或設置不會影響char 是否隱式轉換為整數,但會影響plain char是帶符號類型還是無符號類型。 通常,出於歷史原因,它是簽名的,這是不切實際的。 作為帶符號類型,它仍然與帶signed char ,例如,在函數調用的重載解析方面,而作為無符號類型,則與unsigned char


您可以使用enum定義強類型字節大小的字符編碼值類型:

using Byte = unsigned char;
enum class Byte_char : Byte  {};

“強類型”表示不會隱式轉換為數字。

但是,我更喜歡對類型進行更輕松的類型檢查

enum Byte_char : Byte  {};

它將轉換整數,但其類型不同於將Byte用於其他目的(這並不意味着我使用Byte_char類型,這與在定義此類時發現的實際情況有關)。

就大小而言,實際上也可以將這種類型定義為struct ,因為據我所知,沒有現存的C ++編譯器在單個字節struct插入填充。 但是,這樣的定義可能與std::basic_string的“短緩沖區優化”不兼容。 enum與該優化一起正常工作。

char不會轉換為int char的ASCII碼分配給int值。 如果將char '轉換為int ,則必須獲得整數值5。但是您將得到53,這是代碼'5'。 保存ASCII碼的字節直接擴展為32位值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM