持久性在std :: bitset中起作用吗?

时间:2019-05-14 18:09:49

标签: c++ c++17 endianness std-bitset

当使用不同的字节序存储值时,我知道小字节序先存储最低有效值,大字节序先存储最高有效值。我将以std::uint16_t类型为例:并且将使用十六进制值E9C4

值表示形式

// Unsigned Representation
Hex: E    9    C    4
Bin: 1110 1001 1100 0100
Dec: 59844

// Signed Representation
Dec: -5692

我写了这个小程序,给出了以下输出:

#include <bitset>
#include <cstdint>
#include <iostream>

int main() {
    std::uint16_t uval{ 0xE9C4 };
    std::int16_t  sval{ static_cast<std::int16_t>(0xE9C4) };

    std::bitset<16> bits{ 0xE9C4 };
    std::bitset<16> bitsUnsigned{ uval };
    std::bitset<16> bitsSigned{ static_cast<std::uint64_t>(sval) };

    std::cout << "Comparing Hex Value: 0xE9C4\n";
    std::cout << "Unsigned Short Val   = " << uval << '\n';
    std::cout << "Signed Short Val     = " << sval << '\n'; 
    std::cout << "16 Bits              = " << bits << '\n';
    std::cout << "16 Unsigned Bits     = " << bitsUnsigned << '\n';
    std::cout << "16 Unsigned Bits val = " << bitsUnsigned.to_ullong() << '\n';
    std::cout << "16 Signed Bits       = " << bitsSigned << '\n';
    std::cout << "16 Signed Bits val   = " << static_cast<std::int16_t>( bitsSigned.to_ullong() ) << '\n';                      

    return EXIT_SUCCESS;
}

输出

Comparing Hex Value: 0xE9C4
Unsigned Short Val   = 59844
Signed Short Val     = -5692
16 Bits              = 1110100111000100
16 Unsigned Bits     = 1110100111000100
16 Unsigned Bits val = 59844
16 Signed Bits       = 1110100111000100
16 Signed Bits val   = -5692

现在,我正在运行Windows 7 x64的Intel Quad Core Extreme上使用Visual Studio 2017 CE对此进行编译。据我所知,我相信我的Intel是一台小端机。

我在上面演示的只是数字的自然值,以及它们如何以16位或2个字节的二进制序列表示。我知道,直到定义了大于单个字节的类型或将其表示为某个值时,字节性才成为因素。

我有几个相关的问题,只是为了阐明一些通用原则。

  • 我从std::biset<16>看到的内容是否向我展示了与机器的耐久性无关的自然二进制表示形式?
  • 我编写的小程序给出的位序列;会以自然形式将其视为大端还是小端?
  • 按最高或最低有效位先存储字节时。是否始终将第一个字节视为向右?从一个视图转换为另一个视图的视觉表示也将有所帮助。
  • 最后,由于C ++没有字节序的概念,我如何处理已经存储在std::bitset<x>中的位序列,其中x[8,16,32,64]以便在一个字节序和另一个字节序之间转换?

0 个答案:

没有答案