Просмотр 1ого и 2ого байта 2х байтовой переменной

Захотелось просмотреть содержимое 1ого и 2ого байта 2х байтовой переменной. Пишу код:

#include <iostream>
#include <conio.h>

using namespace std;

int main( int argv, char *argc[] )
{
    setlocale ( 0, "Russian" );
    __int16 i = 11111;
    __int8 *byte;
    byte = ( __int8* )&i;
    cout << "Первый байт равен " << *byte << endl;
    byte++;
    cout << "Второй байт равен " << *byte << endl;
    getch();
    return 0;
}

выводит:

Первый байт равен g
Второй байт равен +

явно не то что надо. думаю ошибка в строке
byte = ( __int8* )&i; по моим расчётам в byte должен занестись адрес первого байта переменной i, так ли это?

Нашёл в чём проблема. Оказывается тип __int8 на самом деле есть тип char, поэтому выводятся символы.

Во-первых, можно сделать так:

#include <iostream>
#include <conio.h>

using namespace std;

int main( int argv, char *argc[] )
{
    setlocale ( 0, "Russian" );
    __int16 i = 0x1234;  // изменил значение чисто для демонстрации
    __int8 *byte;
    byte = ( __int8* )&i;
    cout << "Первый байт равен " << hex << unsigned(*byte) << endl;
    byte++;
    cout << "Второй байт равен " << hex << unsigned(*byte) << endl;
    getch();
    return 0;
}

А ещё можно и вот так поразвлекаться:

#include <iostream>
#include <conio.h>
#include <iomanip>

using namespace std;

template <typename T>
union udump {
    T value;
    unsigned char bytes[sizeof(T)];

    int byte_size() const { return sizeof(T); }

    void dump_it(const char *typname) const {
        cout << "Length of " << typname << " type is " << sizeof(T) << " bytes" << endl;
        cout << "value = " << value << endl;
        for (int i= 0; i < sizeof(T); i++) {
            cout << setw(3) << hex << unsigned(bytes[i]);
        }
        cout << dec << endl << endl;
    }
};

int main( int argv, char *argc[] )
{
    setlocale ( 0, "Russian" );

    udump<int> intval;
    intval.value = 0x1234abcd;  // значение типа int
    intval.dump_it("int");

    udump<long long> llval;
    llval.value = 0x1234abcdLL;  // значение типа long long
    llval.dump_it("long long");

    udump<char> charval;
    charval.value = 'c';  // значение типа char
    charval.dump_it("char");

    udump<double> doubleval;
    doubleval.value = 3.14159265358;  // значение типа double
    doubleval.dump_it("double");

    getch();
    return 0;
}

Фокус в том, что в объединении (union) все данные располагаются с одного адреса (т.е. разделяют одну и ту же область памяти, размер которой равен длине самого длинного типа). Поэтому к этой области памяти можно обратиться как к значению типа, указанного в аргументе шаблона, так и как к массиву байт (ака unsigned char).

Результат, выводимый на терминал методом dump_it(), будет зависеть от используемой платформы.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.