C语言中共用体的问题
unionun_1{inti;doublex;}s1,s2,*p;s1.x=123.4;s1.i=100;printf("%f\n",s1.x);书上说,系统将按照用户选...
union un_1
{int i; double x;} s1,s2,*p;
s1.x=123.4;s1.i=100; printf("%f\n",s1.x);
书上说,系统将按照用户选择的成员类型(double)来解释用用存储区中存放的数值(100)。
1.上题的输出到底是多少?
2.什么叫按照用户选择的成员类型来解释? 是不是说用double型数据来解释int类型?
若是,这是什么意思?两者根本不是一个类型的数据,甚至连占用的内存空间都不一样,如何解释?
3.若是这样呢:
a. 若是可执行语句改成s1.x=123.4;printf(“%d\n",s1.x);
输出结果是多少?
b. 若是这样呢s1.i=100;printf("%f\n",s1.i); 输出结果又是什么? 展开
{int i; double x;} s1,s2,*p;
s1.x=123.4;s1.i=100; printf("%f\n",s1.x);
书上说,系统将按照用户选择的成员类型(double)来解释用用存储区中存放的数值(100)。
1.上题的输出到底是多少?
2.什么叫按照用户选择的成员类型来解释? 是不是说用double型数据来解释int类型?
若是,这是什么意思?两者根本不是一个类型的数据,甚至连占用的内存空间都不一样,如何解释?
3.若是这样呢:
a. 若是可执行语句改成s1.x=123.4;printf(“%d\n",s1.x);
输出结果是多少?
b. 若是这样呢s1.i=100;printf("%f\n",s1.i); 输出结果又是什么? 展开
3个回答
展开全部
输出123.399963
double类型占8个字节,int类型占4个字节,un_1共用体占8个字节,i成员占用它的前四个字节
执行s1.x=123.4;之后,s1位置内存中存放的值为:
40 5E D9 99 99 99 99 9A(十六进制,左边是高位,右边是低位,你可以查查浮点数是如何表示的,double的前12个二进制位表示阶数,后面的表示尾数)
其中i占用前四个字节(低位的四个字节)即99 99 99 9A这部分
执行s1.i=100;之后,i的位置被修改为100即十六进制的64,s1位置内存变为:
40 5E D9 99 00 00 00 64
这是再把它看做一个double的格式输出就是123.399963
改成s1.x=123.4;printf("%d\n",s1.x);
输出为:-1717986918
由于要求输出一个int,所以printf函数只读取了s1.x的前四个(低位的四个)字节
s1位置的内存为:40 5E D9 99 99 99 99 9A
输出的是99 99 99 9A,按照int类型输出为-1717986918(符号位为1,所以是负的)
同理,改成s1.i=100;printf("%f\n",s1.i);
输出为:0.000000
执行s1.i=100;之后,s1位置的内存为
00 00 00 00 00 00 00 64
按照double类型输出为0.000000
double类型占8个字节,int类型占4个字节,un_1共用体占8个字节,i成员占用它的前四个字节
执行s1.x=123.4;之后,s1位置内存中存放的值为:
40 5E D9 99 99 99 99 9A(十六进制,左边是高位,右边是低位,你可以查查浮点数是如何表示的,double的前12个二进制位表示阶数,后面的表示尾数)
其中i占用前四个字节(低位的四个字节)即99 99 99 9A这部分
执行s1.i=100;之后,i的位置被修改为100即十六进制的64,s1位置内存变为:
40 5E D9 99 00 00 00 64
这是再把它看做一个double的格式输出就是123.399963
改成s1.x=123.4;printf("%d\n",s1.x);
输出为:-1717986918
由于要求输出一个int,所以printf函数只读取了s1.x的前四个(低位的四个)字节
s1位置的内存为:40 5E D9 99 99 99 99 9A
输出的是99 99 99 9A,按照int类型输出为-1717986918(符号位为1,所以是负的)
同理,改成s1.i=100;printf("%f\n",s1.i);
输出为:0.000000
执行s1.i=100;之后,s1位置的内存为
00 00 00 00 00 00 00 64
按照double类型输出为0.000000
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
输出的不是123.4
因为先给s1.x赋值之后占用了8个字节,如果这时候printf出来则是123.4
但是紧接着对s1.i进行了赋值,也就是对联合体的8个字节中4个字节的内容进行了改变,导致s1.x的内容产生了变化。
如果将两个赋值语句换个次序就会输出123.400...,因为在对s1.x赋值时将8个字节重新填写
因为先给s1.x赋值之后占用了8个字节,如果这时候printf出来则是123.4
但是紧接着对s1.i进行了赋值,也就是对联合体的8个字节中4个字节的内容进行了改变,导致s1.x的内容产生了变化。
如果将两个赋值语句换个次序就会输出123.400...,因为在对s1.x赋值时将8个字节重新填写
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主别相信Printf打出来的东西。
这样说吧:
int i=123;
double j=123.0;
printf("%%.02f,%f",i,j);
你打出来的i和j是相同的。但是学过c语言的都知道i和j相等么?不相等。
再者,int i= '0x41';
printf("%c",i);
还能打出字母a呢。
所以不要纠结printf,纠结的是内存数据的使用。
这样说吧:
int i=123;
double j=123.0;
printf("%%.02f,%f",i,j);
你打出来的i和j是相同的。但是学过c语言的都知道i和j相等么?不相等。
再者,int i= '0x41';
printf("%c",i);
还能打出字母a呢。
所以不要纠结printf,纠结的是内存数据的使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询