對于此代碼 -
int main()
{
std::wstring wstr = L"é";
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (auto c : myconv.to_bytes(wstr))
{
ss << std::setw(2) << static_cast<unsigned>(c);
}
string ssss = ss.str();
cout << "ssss = " << ssss << endl;
為什么這會列印 ffffffc3ffffffa9 而不是 c3a9?
為什么它在開頭附加 ffffff ?如果你想在 ideone 中運行它 - https://ideone.com/qZtGom
uj5u.com熱心網友回復:
c是 type char,在大多數系統上都已簽名。將 a 轉換char為無符號會導致值被符號擴展。
例子:
- 字符(0x23)又名 35 --> 無符號(0x00000023)
- 字符(0x80)又名 -128 --> 無符號(0xFFFFFF80)
- 字符(0xC3)又名 -61 --> 無符號(0xFFFFFFc3)
[編輯:我的第一個建議沒有奏效;洗掉]
你可以施放兩次:
ss << std::setw(2) << static_cast<int>(static_cast<unsigned char>(c));
第一次轉換為您提供了具有相同位模式的無符號型別,并且由于unsigned char大小與 相同char,因此沒有符號擴展。
但是,如果您只是 output static_cast<unsigned char>(c),則流會將其視為一個字符,并列印 .. something .. 取決于您的語言環境等。
第二個演員給你一個int,流將正確輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/520996.html
