在c ++中单独的byte或int8数据类型

时间:2017-04-24 15:05:05

标签: c++ types byte language-features

我有以下代码:

#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";
}

输出包含如下奇怪的字符:

enter image description here

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

我知道我可以进行一些明确的类型转换,以使其工作如下:

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

另外,我知道我可以自己上课来处理它。

enter image description here

但是,如果可能,我不想使用类型转换或制作特殊类。

我浏览了互联网并在StackOverflow上获得了this,但它没有帮助。

那么,是否有一种在C ++上具有8位整数类型的本机方式,其行为与所有标准库的intshort完全相同?或者这只是无数C ++难以理解的*功能缺席之一?

*至少对我而言。

3 个答案:

答案 0 :(得分:0)

为了便于阅读,您可以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

答案 1 :(得分:0)

uint8_tint8_t 是C ++上真正的8位整数。但是因为它们typedef超过char s(如果它们存在,则无法保证),它们被标准库解释并视为字符。不幸的是,你只需要使用演员。

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

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

附注2:C ++ 17将引入std::byte类型,但它只是unsigned char使用enum class的奇怪包装。它只对整数类型实现按位运算符和转换函数,因此它不是你想要的。

答案 2 :(得分:0)

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

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选项可以自动执行此操作。