当使用不同的字节序存储值时,我知道小字节序先存储最低有效值,大字节序先存储最高有效值。我将以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>
看到的内容是否向我展示了与机器的耐久性无关的自然二进制表示形式?std::bitset<x>
中的位序列,其中x
是[8,16,32,64]
以便在一个字节序和另一个字节序之间转换?