2013-07-07 10 views
2
#include<stdio.h> 
main() 
{ 
    struct value 
    { 
     int bit1 : 1; 
     int bit2 : 4; 
     int bit3 : 4; 
    }bit={1, 2, 2}; 

    printf("%d %d %d\n",bit.bit1,bit.bit2,bit.bit3); 
} 

Выходной сигнал этого кода «-1 2 2» Просьба пояснить логику этого выхода. Значение bit.bit2 и bit.bit3 всегда совпадает с значением, назначенным ему, но бит.бит1 изменяется с разными целыми значениями. Зачем?Непредсказуемый выход с использованием структур в C

+0

самый старший бит, используемый в качестве знака. – BLUEPIXY

ответ

4

Вы должны использовать unsigned int. Самый старший бит определяет, является ли число отрицательным или положительным, если используются знаковые значения. Если у вас есть только один бит, и это 1, то это интерпретируется как отрицательное число, когда установлен старший бит.

Если вы установили другие значения в 15, вы также получите отрицательный результат.

Вы можете изменить выход с помощью команды %u в команде printf, но при назначении и сравнении с другими значениями вы по-прежнему будете иметь нежелательные эффекты.

+0

Извините, что я новичок в C. Можете ли вы объяснить, что означает «int бит1: 1»? Что это такое? – user2492165

+0

Если вы хотите работать с отдельными битами, вы можете использовать бит-поля decalre. Таким образом, ваша структура обрабатывается так, как будто она содержит только один бит, а не int, имеющий 16-32 бит (в зависимости от аппаратного обеспечения). Это более удобно, чем при необходимости маскировать биты, когда вы хотите установить/отключить их. Это также удобно, если вы работаете с оборудованием, чтобы вы могли наложить его на структуру. – Devolus

0

Подписанное бит-поле размера 1 принимает значения в диапазоне [-1 ... 0]. Это является следствием общей формулы [-2^(N-1) ... 2^(N-1) -1] для определения диапазона значений, который может быть сохранен в N битах с представлением комплемента 2 для N = 1.

Если вы ожидали bit1, чтобы сохранить значения 0 или 1, вы можете объявить его unsigned int bit1 : 1;.

1

int x : b ; означает, что вы выделяете только b бит памяти до x вместо значений по умолчанию sizeof(int) байтов. Такой вид объявления возможен только внутри структуры.
Диапазон знакового целого числа в C равен -2^(b-1) to 2^(b-1)-1. Где b - количество бит, используемых для хранения целого числа. Во всех вышеперечисленных случаях происходит переполнение. Хороший компилятор должен дать вам предупреждение о переполнении.

0

В стандарте не указывается, подписано или нет знака int в битовых полях. Вместо этого он заставляет вас явно указывать подпись.

Битовое поле должно иметь тип, который является квалифицированным или неквалифицированным версия _Bool, signed int, unsigned int, или какой-либо другой реализации определенных типов.

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