鱼C论坛

 找回密码
 立即注册
查看: 2658|回复: 12

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

[复制链接]
发表于 2019-6-22 15:56:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
按理来说一个字节是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);    /* 用指针方式输出了这三个域的值 */
}
最佳答案
2019-6-22 22:15:53
int型整数是32bit,这里的15转换成二进制是 1111, 占了4个bit
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-22 22:15:53 | 显示全部楼层    本楼为最佳答案   
int型整数是32bit,这里的15转换成二进制是 1111, 占了4个bit
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

所以编译器编译的时候这个结构体的大小实际上是一个字节(8bit),所以剩下的4bit可以存储15这个整数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-22 22:14:20 | 显示全部楼层
newu 发表于 2019-6-22 16:29
因为一个字节至少是8bit,一个内存单元就是一个字节,所以一个内存单元(1字节)就是他最小单位,

所以编 ...

一个整数是32bit啊,4bit怎么存进去的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 15:09:43 | 显示全部楼层
newu 发表于 2019-6-22 22:15
int型整数是32bit,这里的15转换成二进制是 1111, 占了4个bit

啊 明白了  谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-25 15:18:54 | 显示全部楼层
dapeng_c 发表于 2019-6-25 15:11
您能再回答我一个问题吗?

int a=201,b=012;

因为前边加个0表示的是八进制的12,输出的是十进制,所以结果是10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 16:19:15 | 显示全部楼层
newu 发表于 2019-6-25 15:18
因为前边加个0表示的是八进制的12,输出的是十进制,所以结果是10

书上都是按照16位来算,如果我按32位来算答案会不会被当做错误答案,影响我的成绩?
比如书上输出(八进制)-14是177762(16位),而我的电脑37777777762(32位)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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位)
我过几天要参加专接本的考试,我按我电脑的输出来填答案会被当做错误答案吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是答题系统吗?问问老师吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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位);我过几天要参加专接本的考试,我按我电脑的输出来填答案会被当做错误答案吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 16:22:38 | 显示全部楼层
newu 发表于 2019-6-25 16:20
是答题系统吗?问问老师吧

不是,我过几天要参加专接本的考试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 16:24:56 | 显示全部楼层
newu 发表于 2019-6-25 16:20
是答题系统吗?问问老师吧

不是,我过几天要参加专接本的专业考试(不知道为什么老是回复了却消失了,要回复几遍才行一次,好烦)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表