1.计算机里面所有数据是按照补码表示的,就是说比如16位的-1,计算机里面用补码表示成11111111,11111111
(补码的计算是:正数不变,是多少就保存实际的值;负数的话,先变成正数,然后所有位取反(反码),最后加1的补码.如-1:(-)00000000,00000001 -> 00000000,00000001->11111111,11111110(反码) ->11111111,11111111(补码).
2.计算机里面保存的值都是补码,取出来的时候,根据数据类型做不同的分析。比如,下面的程序,unsigned a:3,和int a:3是不一样的,内存里面值是:111的话,前者读出来认为是7,后者读出来就认为是-1.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <memory.h>
#if 1
typedef struct node
{
unsigned a:3;
signed b:3;
int c:3;
}Node;
#else
typedef struct node
{
int a:3;
int b:3;
int c:3;
}Node;
#endif
int main()
{
int a = -1;
Node x;
printf("sizeof(unsigned) == %d/n",sizeof(unsigned));
printf("sizeof(signed) == %d/n",sizeof(signed));
printf("sizeof(Node) == %d/n",sizeof(Node));
memset(&x,0,sizeof(Node));
a=x.a=-1;
a=x.b=-1;
a=x.c=-1;
}
(补码的计算是:正数不变,是多少就保存实际的值;负数的话,先变成正数,然后所有位取反(反码),最后加1的补码.如-1:(-)00000000,00000001 -> 00000000,00000001->11111111,11111110(反码) ->11111111,11111111(补码).
2.计算机里面保存的值都是补码,取出来的时候,根据数据类型做不同的分析。比如,下面的程序,unsigned a:3,和int a:3是不一样的,内存里面值是:111的话,前者读出来认为是7,后者读出来就认为是-1.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <memory.h>
#if 1
typedef struct node
{
unsigned a:3;
signed b:3;
int c:3;
}Node;
#else
typedef struct node
{
int a:3;
int b:3;
int c:3;
}Node;
#endif
int main()
{
int a = -1;
Node x;
printf("sizeof(unsigned) == %d/n",sizeof(unsigned));
printf("sizeof(signed) == %d/n",sizeof(signed));
printf("sizeof(Node) == %d/n",sizeof(Node));
memset(&x,0,sizeof(Node));
a=x.a=-1;
a=x.b=-1;
a=x.c=-1;
}