簡體   English   中英

如何使用十六進制數初始化字符數組?

[英]How to initialize char array using hex numbers?

我使用 utf8 並且必須在 char 數組中保存一個常量:

const char s[] = {0xE2,0x82,0xAC, 0}; //the euro sign

但是它給了我錯誤:

test.cpp:15:40: error: narrowing conversion of ‘226’ from ‘int’ to ‘const char’ inside { } [-fpermissive]

我必須將所有的十六進制數字都轉換為 char,我覺得這很乏味而且味道不好。 有沒有其他正確的方法來做到這一點?

char可以是有signedunsigned (默認值是特定於實現的)。 你可能想要

  const unsigned char s[] = {0xE2,0x82,0xAC, 0}; 

  const char s[] = "\xe2\x82\xac";

或許多最近的編譯器(包括GCC

  const char s[] = "€";

字符串文字是一個char數組,除非你給它一些前綴)

請參閱GCC 的 -funsigned-char (或-fsigned-char )選項。

在某些實現中, charunsignedCHAR_MAX是 255(而CHAR_MIN是 0)。 在其他情況下, char -s 是有signed因此CHAR_MIN為 -128, CHAR_MAX為 127(例如,Linux/PowerPC/32 位和 Linux/x86/32 位上的情況有所不同)。 AFAIK 標准中沒有任何內容禁止 19 位有符號字符。

對您的問題的簡短回答是您正在溢出一個char char的范圍為 [-128, 127]。 0xE2 = 226 > 127. 你需要使用的是一個unsigned char ,它的范圍是 [0, 255]。

unsigned char s = {0xE2,0x82,0xAC, 0};

雖然在您的代碼中放置大量強制轉換可能很乏味,但使用盡可能強的類型對我來說實際上聞起來非常好。

如上所述,當您指定類型“char”時,您是在邀請編譯器選擇編譯器編寫者喜歡的任何內容(有符號或無符號)。 我不是 UTF-8 方面的專家,但如果您不需要,沒有理由讓您的代碼不可移植。

就您的常量而言,我使用了以這種方式將默認常量寫入帶符號整數的編譯器,以及考慮上下文並相應地解釋它們的編譯器。 請注意,有符號和無符號之間的轉換可能會溢出。 對於相同的位數,負數溢出無符號數(顯然),無符號數的最高位設置溢出有符號數,因為最高位表示負數。

在這種情況下,您的編譯器將您的常量視為無符號 8 位 - 或更大 - 這意味着它們不適合有符號 8 位。 我們都很感激編譯器抱怨(至少我是)。

我的觀點是,用演員表來准確地展示你打算發生的事情並沒有什么壞處。 如果編譯器允許您在有符號和無符號之間進行分配,則它應該要求您在不考慮變量或常量的情況下進行轉換。 例如

const int8_t a = (int8_t) 0xFF; // 將是 -1

盡管在我的示例中,最好分配 -1。 當您必須添加額外的強制轉換時,它們要么有意義,要么您應該對常量進行編碼,以便它們對您分配給的類型有意義。

有沒有辦法混合這些? 我想要一個定義宏FX_RGB(R,G,B)來生成一個常量字符串 "\\x01\\xRR\\xGG\\xBB" 所以我可以執行以下操作: const char* LED_text = "Hello " FX_RGB(0xff, 0xff, 0x80) "World"; 並得到一個刺痛: const char* LED_text = "Hello \\x01\\xff\\xff\\x80World";

暫無
暫無

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

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