【问题标题】:conversion of integers into binary in c++在 C++ 中将整数转换为二进制
【发布时间】:2021-11-03 09:59:31
【问题描述】:

众所周知,每个值都以二进制形式存储在内存中。那么,在 C++ 中,这两个值在内存中存储时会具有不同的二进制数吗?

unsigned int a = 90;
signed int b = 90;

【问题讨论】:

  • 90 在这两种类型的范围内,因此它们在内存中将具有相同的二进制布局。尝试使用在一种类型范围内但不在另一种类型范围内的值,看看会发生什么。
  • 我不认为标准要求内存表示(我们可能有 LeftToRight 用于有符号,RightToLeft 用于无符号)。

标签: c++ memory types binary integer


【解决方案1】:

那么,在 C++ 中,这两个值在内存中存储时会具有不同的二进制数吗?

C++ 语言没有具体说明它们是否这样做。最终,二进制表示是由硬件决定的,所以技术上的答案取决于它。

也就是说,我还没有遇到硬件和 C++ 实现,其中具有相同值的整数的有符号和无符号变体没有相同的二进制表示。因此,如果二进制表示不同,我会感到惊讶。


旁注:由于“字节”是 C++ 中最小的可寻址内存单元,因此该语言无法观察内存中各个位的方向顺序。

【讨论】:

    【解决方案2】:

    考虑值 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::binio-manipulator,所以我用了std::hex(很粘)。 reinterpret_cast 可以,因为前面提到的 char 的特殊规则。因为std::cout &lt;&lt; 有特殊的重载来打印字符,但是我们想看到数值,需要另一个转换。上面的输出是:

    003f 0000 0000 0000 
    003f 0000 0000 0000 
    

    Live Demo

    正如评论中已经提到的,字节顺序是实现定义的。此外,我不得不承认,我不知道标准对此有何详细说明。小心有关字节表示的假设,尤其是在两个程序之间或通过线路传输对象时。您通常会使用某种形式的反序列化/序列化,这样您就可以控制要传输的字节表示。

    TL;DR:通常是的,通常你需要仔细考虑 C++ 标准的要求,我不知道有符号和无符号保证具有相同的字节表示。

    【讨论】:

    • 不幸的是(通常在 C++ 中),显示一个案例(在一个平台上)可能只是暗示强制行为(或使某些错误假设无效)。
    • @Jarod42 确实,我试图澄清这一点。我不确定 OP 期望什么作为答案,我认为展示一种看待一个案例的方法可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2012-04-10
    • 2021-09-20
    • 2018-03-01
    • 2018-07-07
    • 2012-05-11
    相关资源
    最近更新 更多