我们知道,每个值都以二进制形式存储在内存中。那么,在c++中,这两个值在存储在内存中时会有不同的二进制数吗?
unsigned int a = 90;
signed int b = 90;
那么,在c++中,这两个值存储在内存中时会有不同的二进制数吗?
c++语言没有指定它们是否存在。最终,二进制表示是由硬件决定的,所以技术上的答案取决于此。
也就是说,我还没有遇到过硬件和c++实现中整数的相同值的有符号和无符号变体没有相同的二进制表示的情况。因此,如果二进制表示不同,我会感到惊讶。
旁注:Since "byte"是c++中最小的可寻址内存单元,在c++语言中没有一种方法来观察内存中单个位的方向顺序。
考虑值63。二进制是111111
,十六进制是3f
。
由于char
在c++中是特殊的,并且任何对象都可以被视为字节序列,因此您可以直接查看二进制表示:
#include <iostream>
#include <iomanip>
int main()
{
unsigned int a = 63;
signed int b = 63;
std::cout << std::hex;
char* a_bin = reinterpret_cast<char*>(&a);
for (int i=0; i < sizeof(unsigned int); ++i)
std::cout << std::setw(4) << std::setfill('0') << static_cast<unsigned>(*(a_bin+i)) << " ";
std::cout << "n";
char* b_bin = reinterpret_cast<char*>(&b);
for (int i=0; i < sizeof(signed int); ++i)
std::cout << std::setw(4) << std::setfill('0') << static_cast<unsigned>(*(b_bin+i)) << " ";
}
不幸的是,没有std::bin
- io操纵器,所以我使用std::hex
(它是粘性的)。reinterpret_cast
是可以的,因为前面提到的char
的特殊规则。由于std::cout <<
具有打印字符的特殊重载,但我们希望看到数值,因此需要进行另一次强制转换。上面的输出是:
003f 0000 0000 0000
003f 0000 0000 0000
现场演示
正如在注释中已经提到的,字节顺序是实现定义的。此外,我必须承认,我不知道标准对这一点的详细说明。要小心关于字节表示的假设,特别是在两个程序之间或通过网络传输对象时。您通常会使用某种形式的反/序列化,这样您就可以控制要传输的字节表示。
TL;DR:通常是的,通常你需要仔细考虑c++标准的要求,我不知道有符号和无符号是否保证具有相同的字节表示。