显示内存中字节存储顺序,原码,反码,补码函数

Aki 发布于 2022-11-01 284 次阅读


#include<format>
#include<iostream>

//展示一个变量字节的函数

using byte_pointer = unsigned char*;
void show_byte(byte_pointer start, size_t len)
{
    printf("内存中字节表示为:");
    for (size_t i = 0; i < len; ++i)
    {
        printf("%.2x", start[i]);
        //cout << format("{0:2x}", start[i]);
    }
    cout << endl;
}


template<class T>
void show_bytes(T&rhs,size_t len = 0)
{
    show_byte(reinterpret_cast<byte_pointer>(&rhs), (len ==0?sizeof(T):len));
}


//显示一个整数补码反码原码的函数
template<class T>
void binary_and_two_complement(T rhs)
{
    vector<T> s;
    T temp = rhs;
    size_t sizes = sizeof(T) * 8;
    if (rhs > 0)
    {
        while (rhs > 0)
        {
            s.push_back(rhs % 2);
            rhs /= 2;
        }
        for (size_t i = s.size(); i < sizes; ++i)
        {
            s.push_back(0);
        }
        cout <<temp <<"  原码/补码/反码为:";
        for (auto i = s.rbegin(); i != s.rend(); ++i)
        {
            cout << *i;
        }
        cout << endl;
        cout << temp << "  的十六进制为:0x" << hex << temp << endl;
        return;
    }
    else
    {
        T tmp = -rhs;
        while (tmp > 0)
        {
            s.push_back(tmp % 2);
            tmp /= 2;
        }
        for (size_t i = s.size(); i < sizes; ++i)
        {
            s.push_back(0);
        }
        s.back() = 1;
        cout << format("{0} 的原码为:", temp);
        for (auto i = s.rbegin(); i != s.rend(); ++i)
        {
            cout << *i;
        }
        cout << endl;

       for (auto i = s.begin(); i != --s.end(); ++i)
     {
         if (*i == 1)
         {
             *i = 0;
         }
         else
         {
             *i = 1;
         }
     }
       cout << format("{0} 的反码为:", temp);
       for (auto i = s.rbegin(); i != s.rend(); ++i)
     {
         cout << *i;
     }
       cout << endl;

        if (s.front() == 0)
        {
            s.front() = 1;
        }
        else
        {
            auto i = s.begin();
            for(;i != s.end()&&( * i !=0);++i)
            {
                *i = 0;
            }
            if(i < s.end() && i>=s.begin())
            *i = 1;
        }
        cout << format("{0} 的补码为:", temp);
        for (auto i = s.rbegin(); i != s.rend(); ++i)
        {
            cout << *i;
        }
        cout << endl << temp << " 的十六进制为:0x" << hex << temp;
    }
}