2013-12-09 3 views
0

Я определил экран с структурой, как показано ниже:Что случилось с определением этой структуры?

struct 
{ 
    private: 

    //data and attributes 
    char character     : 8; 
    unsigned short int foreground : 3; 
    unsigned short int intensity : 1; 
    unsigned short int background : 3; 
    unsigned short int blink  : 1; 

    public: 

    unsigned short int row; 
    unsigned short int col; 

    //a function which gets row, column, data and attributes then sets that pixel of the screen in text mode view with the data given 
    void setData (unsigned short int arg_row, 
        unsigned short int arg_col, 
        char arg_character, 
        unsigned short int arg_foreground, 
        unsigned short int arg_itensity, 
        unsigned short int arg_background, 
        unsigned short int arg_blink) 
    { 
     //a pointer which points to the first block of the screen in text mode view 
     int far *SCREEN = (int far *) 0xB8000000; 

     row = arg_row; 
     col = arg_col; 
     character = arg_character; 
     foreground = arg_foreground; 
     intensity = arg_itensity; 
     background = arg_background; 
     blink = arg_blink; 

     *(SCREEN + row * 80 + col) = (blink *32768) + (background * 4096) + (intensity * 2048) + (foreground * 256) + character; 
    } 
} SCREEN; 

, но когда я использую символы с более чем «128» кодом ASCII в использовании этой структуры, данные будут разбились. Я определил поле символов с 8 бит. так что случилось с этим определением?

+0

ОК. принимая мою ошибку. это не важно. что не так с кодом? –

+2

Почему вы используете бит-поле на вашем 'char'? Я этого не понимаю. Я также не могу понять значение «данные будут разбиты». Что это значит? –

+0

проблема решена. Мне пришлось использовать unsigned. Я имел в виду, что данные будут ошибочными. это было поле знакового бита. –

ответ

3

В компиляторе C++ вы используете, очевидно, char подписан и так в 8 битовый символ вы подходите значения от -128 к 127 (предполагающие два дополняет представление для отрицательных значений используется). Если вы хотите, чтобы у вас была возможность соответствовать значениям, большим или равным 128, используйте unsigned char.

+1

iirc signednes char не определен (по стандарту, а не компиляторам) – NoSenseEtAl

+2

'char' может быть подписан. Или может быть неподписанным. –

+0

@DavidHeffernan Я не понял, что вы подразумеваете под этим комментарием. OP объявила поле как символ char: 8; 'и это знак подписанный, и поэтому он не может соответствовать значениям 128 и выше. –

Смежные вопросы