签名int在c语言assignd位域但混乱

时间:2017-01-31 05:52:46

标签: c bit-fields signed-integer

目前我正在研究c并面临关于结构中已签名的int的混淆,这里我举了一个例子:

#include <stdio.h>
#include <string.h>

struct {
  signed int age : 4;
} Age;

int main( ) {

   Age.age = -8;
   printf("Age.age : %d\n", Age.age );

   return 0;
}

这里,我已经描述了int在存储值时占用的位的大小。我在这里为年龄分配值-8。因此它将存储值为1000,如8和-8,它应存储为11000,其中第1位称为符号位。因此,如果int age必须存储-8,它必须有5位,但在编译给定示例时,它不会给出错误并显示输出。

请帮我处理我的问题。

1 个答案:

答案 0 :(得分:2)

可能在您的系统上使用2's complement表示存储整数。

在2的补码中,4位位域可以保持-8+7的范围。位表示1000将表示-8,并且无法存储+8

分配超出范围的值(例如在这种情况下为+8)会导致实现定义的行为。