2012-04-10 3 views
7
#include<stdio.h> 

int main() 
{ 
    struct value{ 
     int bit1 : 1; 
     int bit3 : 4; 
     int bit4 : 4; 
     }bit={1,2,2}; 
    printf("%d %d %d\n",bit.bit1,bit.bit3,bit.bit4); 
    return 0; 
} 

Выход:Объяснить поведение 1-битных битовых полей

-1 2 2

Пожалуйста, объясните oupput программы?

+1

Кажется, домашнее задание. – spidey

+1

Реализация определяется, являются ли битовые поля 'int'' signed int' или 'unsigned int'. На некоторых компиляторах вы можете получить '1 2 2' в качестве вывода. Для переносимости вы должны использовать 'unsigned int' или' signed int' для бит-полей. Или не используйте битовые поля. – ouah

ответ

8

Предположительно единственный любопытный выход - первый.

Ну, рассмотрим диапазон значений, который может представлять целое число 1 бит two's-complement.

+0

Не могли бы вы объяснить результат немного подробнее? Как он фактически сохраняет значения в своих полях? Скажем, если я изменил бит1: 1 бит2: 8 бит3: 8, показав -1 -8 -8 в качестве вывода, почему так? –

+0

@code_hacker: вам нужно прочитать о том, как работает два дополнения (см. Ссылку в моем ответе). Тогда это имеет смысл. –

9

bit1 является подписанным 1-битным целым числом, которое может содержать только значения -1 и 0.

+0

Инициализация делает преобразование из (подписанного) целого числа '1' в этот диапазон, так что это даже неопределенное поведение, нет? –

2

Примечание ниже заявление внутри структура:

INT bit1: 1; -> 'int' указывает , что это SIGNED integer. Для целых целых чисел крайний левый бит будет приниматься за знак +/-. Если вы сохраняете 1 в 1-битовом поле: Самый левый бит равен 1, поэтому система будет обрабатывать значение как отрицательное число.

Метод дополнений 2 - это , используемый системой для обработки отрицательных значений .

Следовательно, сохраненные данные: 1. . 2-й дополнение 1 также является 1 (отрицательный).

Поэтому -1 печатается.

Если вы храните 2 в 4-битное поле: Binary 2: 0010 (самый левый бит равен 0, так система будет относиться к нему, как положительное значение) 0010 составляет 2 Поэтому 2 печатается.

+0

Для бит-полей 'int' не обязательно означает SIGNED. В руководстве gcc указано: «Стандарт ISO C оставляет за собой реализацию, независимо от того, подписан ли бит-поле plain int или нет. Это фактически создает два альтернативных диалекта C.». Однако как gcc, так и MSVC принимают его как подписанное: см. Http://msdn.microsoft.com/en-US/library/yszfawxh%28v=vs.80%29.aspx и http://gcc.gnu.org/ onlinedocs/GCC-4.1.2/ССАГПЗ/Non_002dbugs.html. –

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