2016-02-16 5 views
1

Следующий код, выполняемый в eclipse, запущенный на Ubuntu и скомпилированный с использованием компилятора g ++, предоставляет неожиданные результаты.Почему вывод этой программы неожиданно?

код:

#include <iostream> 
int main() 
{ 
    unsigned int a=5555; 
    std::cout << (unsigned int)(((char*)&a)[0]) << "\n"; 
    std::cout << (unsigned int)(((char*)&a)[1]) << "\n"; 
    std::cout << (unsigned int)(((char*)&a)[2]) << "\n"; 
    std::cout << (unsigned int)(((char*)&a)[3]) << "\n"; 

    return 0; 
} 

Я пытаюсь обработать переменную a как массив целых чисел, каждая из которых одного размера байта. Когда я выполнить программу, это то, что я получаю в качестве вывода:

выход:

4294967219 
21 
0 
0 

вопрос:

Почему первое значение отображается так велико (здесь int имеет размер 32 бит или 4 байта). Значит, каждое из выходных значений должно быть не более 255? И почему последние три значения равны нулю? Или почему я получаю неправильный результат?

Я также получил тот же результат при тестировании в блоке code :: block, работающем с тем же компилятором.

ответ

5

Это связано с расширением знака. Давайте посмотрим на ваш unsigned int a в памяти:

b3 15 00 00 

Когда вы приводите первые байты из signed char к unsigned int, отлитые из char в int происходит перед переходом от signed к unsigned, и, следовательно, знак бит расширенный, а результат (0xffffffb3) - это то, что вы видите на первой строке.

Попробуйте отливку до unsigned char * вместо char *.

+0

используя неподготовленный знак * на месте char * работал. – Sreram

6

Это потому, что char является знаком целочисленного типа.

Десятичный 5555 - шестнадцатеричный 0x15b3.

Байт 0xb3, когда знак-удлинен до signed int, становится 0xffffffb3.

0xffffffb3 не имеет значения unsigned int - 4294967219 в виде десятичного знака.

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