union共用体在这里你可以理解为将某一段截下来
这里union里面存放的long int和char[4]都是4个字节,共用一段内存,scanf了一个long int后a里面存放的是long int(4B,32b),可以通过a.c[k]来访问其对应位置上的部分,比如a.c[0]是0-7b,a.c[1]是8-15b,a.c[2]是16-23b,a.c[3]是24-31b(注意这里需要区分大端模式和小端模式,即高八位低八位,这里假设是大端模式)
511的二进制表示为1 11111111,存放到long int为00000000 00000000 00000001 11111111,如果是大端模式则a.c[0]为前8b:00000000;a.c[1]为第二个8b:00000000,a.c[2]为第三个8b:00000001,a.c[3]为第四个8b:11111111
在char类型下00000001为1,11111111为-1
十进制的511转换为二进制为 1 1111 1111 ,长整型占四个字节,长整形 i 和字符数字 c 占用同一片空间,所以 四个字符数组的值分别为 0x00 0x00 0x01 0xff,将这四个有符号字符强制 转换为 长整型输出时 值 就是 0 0 1 -1,由于字符是有符号类型,所以0xFF 就代表 负数,char 类型的范围为 -128~127。
首先long int是32位的,char是八位的,union是共享内存,然后i输入511的话也就是十六进制00 00 01 ff,对应char k[0]==0xff,k[1]==0x01,k[2]==0x00,k[3]==0x00,从高位输出就是 0x00 0x00 0x01 0xff ,转换成long对应就是0 0 1 -1(0xffffffff)