dapeng_c 发表于 2019-6-22 15:56:00

关于C中位域的赋值问题 [color=Red](新人)[/color]

按理来说一个字节是8位,一个整型变量占4个字节也就是32位
为什么一个4位的位域变量能存放值为15的整型?
代码如下:

#include<stdio.h>
void main(){
    struct bs{
      unsigned a:1;
      unsigned b:3;
      unsigned c:4;
    } bit,*pbit;
    bit.a=1;    /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.b=7;    /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.c=15;    /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    printf("%d,%d,%d\n",bit.a,bit.b,bit.c);    /* 以整型量格式输出三个域的内容 */
    pbit=&bit;    /* 把位域变量 bit 的地址送给指针变量 pbit */
    pbit->a=0;    /* 用指针方式给位域 a 重新赋值,赋为 0 */
    pbit->b&=3;    /* 使用了复合的位运算符 "&=",相当于:pbit->b=pbit->b&3,位域 b 中原有值为 7,与 3 作按位与运算的结果为 3(111&011=011,十进制值为 3) */
    pbit->c|=1;    /* 使用了复合位运算符"|=",相当于:pbit->c=pbit->c|1,其结果为 15 */
    printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);    /* 用指针方式输出了这三个域的值 */
}

newu 发表于 2019-6-22 22:15:53

int型整数是32bit,这里的15转换成二进制是 1111, 占了4个bit

newu 发表于 2019-6-22 16:29:28

因为一个字节至少是8bit,一个内存单元就是一个字节,所以一个内存单元(1字节)就是他最小单位,

所以编译器编译的时候这个结构体的大小实际上是一个字节(8bit),所以剩下的4bit可以存储15这个整数

dapeng_c 发表于 2019-6-22 22:14:20

newu 发表于 2019-6-22 16:29
因为一个字节至少是8bit,一个内存单元就是一个字节,所以一个内存单元(1字节)就是他最小单位,

所以编 ...

一个整数是32bit啊,4bit怎么存进去的呢?

dapeng_c 发表于 2019-6-25 15:09:43

newu 发表于 2019-6-22 22:15
int型整数是32bit,这里的15转换成二进制是 1111, 占了4个bit

啊 明白了谢谢

dapeng_c 发表于 2019-6-25 15:11:50

newu 发表于 2019-6-22 22:15
int型整数是32bit,这里的15转换成二进制是 1111, 占了4个bit

您能再回答我一个问题吗?

int a=201,b=012;
printf("%2d,%2d\n",a,b);

上述代码为什么结果是201和10

newu 发表于 2019-6-25 15:18:54

dapeng_c 发表于 2019-6-25 15:11
您能再回答我一个问题吗?

int a=201,b=012;


因为前边加个0表示的是八进制的12,输出的是十进制,所以结果是10

dapeng_c 发表于 2019-6-25 16:19:15

newu 发表于 2019-6-25 15:18
因为前边加个0表示的是八进制的12,输出的是十进制,所以结果是10

书上都是按照16位来算,如果我按32位来算答案会不会被当做错误答案,影响我的成绩?
比如书上输出(八进制)-14是177762(16位),而我的电脑37777777762(32位)

dapeng_c 发表于 2019-6-25 16:20:28

newu 发表于 2019-6-25 15:18
因为前边加个0表示的是八进制的12,输出的是十进制,所以结果是10

还有书上输出(指数)3.5是3.50000e+00(小数点后5位,e后3位)
而我的电脑是3.5000000e+000(小数点后6位,e后4位)
我过几天要参加专接本的考试,我按我电脑的输出来填答案会被当做错误答案吗?

newu 发表于 2019-6-25 16:20:50

dapeng_c 发表于 2019-6-25 16:19
书上都是按照16位来算,如果我按32位来算答案会不会被当做错误答案,影响我的成绩?
比如书上输出(八进 ...

是答题系统吗?问问老师吧{:10_266:}

dapeng_c 发表于 2019-6-25 16:21:04

newu 发表于 2019-6-25 15:18
因为前边加个0表示的是八进制的12,输出的是十进制,所以结果是10

还有书上输出指数)3.5是3.50000e+00(小数点后5位,e后3位),而我的电脑是3.5000000e+000(小数点后6位,e后4位);我过几天要参加专接本的考试,我按我电脑的输出来填答案会被当做错误答案吗?

dapeng_c 发表于 2019-6-25 16:22:38

newu 发表于 2019-6-25 16:20
是答题系统吗?问问老师吧

不是,我过几天要参加专接本的考试

dapeng_c 发表于 2019-6-25 16:24:56

newu 发表于 2019-6-25 16:20
是答题系统吗?问问老师吧

不是,我过几天要参加专接本的专业考试(不知道为什么老是回复了却消失了,要回复几遍才行一次,好烦)
页: [1]
查看完整版本: 关于C中位域的赋值问题 [color=Red](新人)[/color]