2017-01-08 6 views
-4
#include<stdio.h> 
int main(void) 
{ 
struct str 
{ 
    int i: 1; 
    int j: 2; 
    int k: 3; 
    int l: 4; 
}; 

struct str s; 

s.i = 1; 
s.j = 2; 
s.k = 5; 
s.l = 10; 

printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l); 

getchar(); 
return 0; 
} 

Вывод Учитывая на сайте:Может кто-нибудь объяснить мне, почему мы получаем следующий результат?

i: 1 
j: 2 
k: 5 
l: 10 

Я получил

i :-1 
j : -2 
k : -3 
l : -6 

Я не понимаю, что битовое поле. И может ли кто-нибудь сказать мне, что здесь происходит в этом коде?

+2

Прочитайте свою книгу или Google или найдите этот сайт, чтобы узнать, что такое бит-поле. И ваши результаты отличаются от примера, потому что большая часть поведения битполей не стандартизирована. Поэтому рекомендуется избегать бит-полей, если вы хотите, чтобы ваш код работал на разных или будущих компиляторах. –

+2

* «Вывод на сайте» * - Какой сайт? – StoryTeller

+1

'int i: 1' делает нулевой смысл. Поле бит signed-int резервирует бит для знака, и поскольку вы предоставили только один бит, вы остаетесь с битовым полем с подписанным int, которое может быть отрицательным или положительным, но не имеет допустимого значения величины (есть никакие биты не оставлены для значения). Остальная часть этого кода, по-видимому, делает попытку нарушить максимальное значение, которое может быть предоставлено в предоставленных битах (за вычетом знакового бита). – WhozCraig

ответ

2

Если вы записываете столбец возможных шаблонов бит для каждой ширины этих подписанных переменных, с десятичным эквивалентом рядом с ними, вы скоро увидите, почему вы получаете эти результаты. Предполагая повторное представление дополнения 2, однобитовая подписанная переменная имеет два возможных значения: -1 и 0. 2-битная подписанная переменная сохраняет значения в диапазоне от -2 до 1 и так далее.

Bin Dec  Bin Dec  Bin Dec 
011 3  01 1  0 0 
010 2  00 0  1 -1 
001 1  11 -1 
000 0  10 -2 
111 -1 
110 -2 
101 -3 
100 -4 

В вашем случае s.i = 1;int значение 1 в двоичной 1, и, как вы можете видеть, для переменной 1-битовым, это имеет значение -1.

В вашем случае s.j = 2; значение int значение 2 является двоичным 10, и, как вы можете видеть для 2-битной переменной, это значение -2.

В вашем случае s.k = 5; значение int значение 5 является бинарным 101, и, как вы можете видеть для 3-битовой переменной, это значение -3.

Однако это просто объяснение того, что может произойти , потому что это поведение, определяемое реализацией, для назначения значения, которое находится за пределами представляемого диапазона знакового целого.

Я оставлю вас, чтобы выработать 4-битный для себя. С s.l = 10; это значение также выходит за пределы диапазона 4-разрядной подписанной переменной, которая составляет от -8 до 7.

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