簡體   English   中英

打印十六進制字符

[英]Printing hex characters

我想了解打印出一個字符和一個無符號字符的結果。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int8_t a = 0xA1;
    uint8_t b = 0xA1;
    printf("0x%x,", a);
    printf("0x%x,", b);
    std::cout << std::hex << a << ",";
    std::cout << std::hex << b << std::endl;
}

結果

0xffffffa1,0xa1,�,� 

我不明白為什么有符號的 char 變成了 uint 或 int,以及為什么 std::hex 慘遭失敗。

int8_t a = 0xA1; 導致有符號溢出,因此行為未定義。 如果你打開了正確的編譯器標志,你會得到類似的東西:

error: overflow in conversion from 'int' to 'int8_t' {aka 'signed char'} changes value from '161' to '-95' [-Werror=overflow]

    8 |     int8_t a = 0xA1;

      |                ^~~~

此外, %x需要一個unsigned int 這也會導致未定義的行為。 你的意思是做這樣的事情:

#include <iostream>

int main()
{
    int8_t a = 42; // Doesnt overflow
    uint8_t b = 42;
    std::printf("%#x,", static_cast<unsigned int>(a));
    std::printf("%#x,", static_cast<unsigned int>(b));
    std::cout << std::hex << static_cast<unsigned int>(a) << ",";
    std::cout << std::hex << static_cast<unsigned int>(b) << std::endl;
}

輸出: 0x2a,0x2a,2a,2a

暫無
暫無

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

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