c++ 中的单独字节或 int8 数据类型

Separate byte or int8 data type in c++

我有以下代码:

#include <iostream>
using namespace std;

typedef uint8_t byte;

int main()
{
    byte x[5] = {0,1,2,3,4};

    byte* xptr = x;

    for (int i = 0; i < 5; ++i)
    {
        cout << "\n x[" << i
            << "] = " << *xptr
            << " at " << xptr;
        xptr = xptr + 1;
    }

    xptr = xptr - 5;

    cout << "\n\n\n";
}

输出包含如下奇怪字符:

我预计这是因为 uint8_t 的基础类型与 char 数据类型相关。

我知道我可以做一些明确的类型转换来让它工作,如下所示:

cout << "\n x[" << i
    << "] = " << (int)*xptr
    << " at " << (void*)xptr;

另外,我知道我可以让 class 自己处理。

但是,我宁愿不使用类型转换,或者如果可能的话做一个特殊的class。

我通过互联网在 Whosebug 上找到了 this,但没有帮助。

那么,有没有一种本地方法可以在 C++ 上拥有一个 8 位整数类型,其作用与所有标准库的 intshort 完全一样?或者这只是无数 C++ 令人信服* 缺失的功能之一?

*至少对我来说是这样。

为了可读性,您可以 use hexadecimal base 并转换为 int:

for (int i = 0; i < 5; ++i)
    {
        cout << "\n x[" << i << "] = " << (int)*xptr << " at " << hex << (int)xptr;
        xptr++;
    }

输出:

 x[0] = 0 at 8ffeb0
 x[1] = 1 at 8ffeb1
 x[2] = 2 at 8ffeb2
 x[3] = 3 at 8ffeb3
 x[4] = 4 at 8ffeb4

uint8_tint8_t C++ 上真正的 8 位整数。但是因为它们比 chars 多 typedefs(如果它们存在,则不能保证),它们被标准库解释并视为字符。不幸的是,你只需要使用演员表。

旁注:你不需要在这里使用指针,使用数组索引:

for (int i = 0; i < 5; ++i)
{
    cout << "\n x[" << i
        << "] = " << (int)x[i]
        << " at " << hex << &x[i] << dec;
}

旁注 #2:C++17 将引入 std::byte 类型,但它只是使用 enum class 围绕 unsigned char 的奇怪包装器。它只实现按位运算符和整数类型之间的转换函数,所以它不是你要找的。

如果您只关心可读的输出格式,并且不想每次都输入强制转换表达式,您可以简单地在前面加上一元运算符:

cout << +x;

这执行到 int 的隐式转换。

示例:

#include <iostream>
int main()
{
    char ch = 'D';
    std::cout << ch << "\n";   // Displays "D"
    std::cout << +ch << "\n";  // Displays "68"
}

遗憾的是,没有像 std::dec I/O 操纵器这样的 ostream 选项可以自动执行此操作。