[英]Printed unsigned chars as hex are too long
假設我有一個非常簡單的示例:
vector<unsigned char> bytes {0xFF, 0xFF, 0xFD};
for (const char & v: bytes) {
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}
cout << endl;
這給出:
FFFFFFFF FFFFFFFF FFFFFFFD
但是,我想簡短一點,例如:
FF FF FD
那么,為什么還要獲得許多額外的“ FFFFF”?
如果使循環中的char
保持未簽名狀態,則會得到所需的結果:
for (const unsigned char & v: bytes) {
// ^^^^^^^^
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}
auto
或auto&
也會起作用,因為矢量元素是無符號的。
之所以得到FF
是因為系統上的char
是帶符號的 ,這意味着這些值在轉換為整數時會進行符號擴展。
for (const char & v: bytes)
您正在將以bytes
為bytes
每個元素隱式轉換為char
,該char
似乎signed
在您的平台上signed
。 然后,當您將char
強制轉換為unsigned
char
時, char
會經歷符號擴展,最后得到較大的十六進制值。
將以上更改為以下之一
for (const unsigned char & v: bytes)
for (auto const& v: bytes)
for (auto v: bytes) // since it's only a char copying might be better
就像其他人所說的,發生這種情況是因為您正在將元素轉換為已簽名的char。 我更喜歡以這種方式使用for循環來防止此類錯誤:
vector<unsigned char> bytes{ 0xFF, 0xFF, 0xFD };
for (int i = 0; i < bytes.size(); i++) {
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(bytes[i]) << " ";
}
使用迭代器也是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.