鱼C论坛

 找回密码
 立即注册
查看: 1494|回复: 11

数组空间的大小和二进制的打印,位域

[复制链接]
发表于 2015-7-23 19:10:44 | 显示全部楼层 |阅读模式
5鱼币
插入代码:(问题在代码的注释里面)
#include<stdio.h>
#include<stdlib.h>

int main(void){
        int i=-3;
        char str[3]; //这里和问题相关
        
        struct bin{
        signed char n:1;        
        }use;
        
        printf("---------------\n ");
        printf("n=%d;n2=%d;\n",use.n);
        printf("---------------\n\n");
        
        while(i<=3){
                use.n=i;
                itoa(use.n,str,2);
                printf("use.n=%2d  i=%2d bin:%s\n",use.n,i,str);
                i++;        
        }
        return 0;
}

//为什么当数组空间不够大的时候,只打印 n=-1呢?  

运行结果

运行结果

时间:2013年7月23日19:11:55;

最佳答案

查看完整内容

int i=-3;定义成全局变量。应该不会这样。好像是堆栈出问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-23 19:10:45 | 显示全部楼层
int i=-3;定义成全局变量。应该不会这样。好像是堆栈出问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-24 09:23:37 | 显示全部楼层
本帖最后由 yjip267 于 2015-7-24 09:25 编辑

signed char n:1;   占一位并且是有符号的。而-3的占4个字节0xfdffffff,这个样的。就是把0Xfd第一位赋给了N,所以是-1,而不是数据不够大。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
lark + 1 + 1 谢谢回答,但是我还是有些不太清楚

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-26 12:11:37 | 显示全部楼层
我是知道的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-26 12:12:19 | 显示全部楼层
00000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-26 12:12:57 | 显示全部楼层
大哥啊啊啊

评分

参与人数 1荣誉 -2 鱼币 -2 收起 理由
ryxcaixia -2 -2 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-26 12:13:54 | 显示全部楼层
大哥啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-27 16:25:29 | 显示全部楼层

不好意思,我一天只上一次论坛,或者几天上一次论坛,回复也就慢了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-27 16:38:10 | 显示全部楼层
yjip267 发表于 2015-7-24 09:23
signed char n:1;   占一位并且是有符号的。而-3的占4个字节0xfdffffff,这个样的。就是把0Xfd第一位赋给了N ...

signed char n:1;   占一位并且是有符号的。而-3的占4个字节0xfdffffff,这个样的。就是把0Xfd第一位赋给了N,所以是-1,而不是数据不够大。

那为什么i的数值会发生变化?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-27 17:30:33 | 显示全部楼层
yjip267 发表于 2015-7-24 09:23
signed char n:1;   占一位并且是有符号的。而-3的占4个字节0xfdffffff,这个样的。就是把0Xfd第一位赋给了N ...
#include<stdio.h>
#include<stdlib.h> 
int main(void){
        char str[40];
        printf("char=%c,int=%d;\n",(signed char)0xfd,(signed int)0xfd);
        itoa(0xfd,str,2);
        printf("0xf=\n%s\n",str);
        return 0;
} 
打印结果:
char=?int=253;
0xf=
11111101
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-28 10:33:23 | 显示全部楼层
while(i<=3)
{
                use.n=i;
                itoa(use.n,str,2);
                printf("use.n=%2d  i=%2d bin:%s\n",use.n,i,str);
                i++;        
        }
其中i的值从-3到2,十六进制0xfffffffd,0xfffffffe,0xfffffff,0,1,2,而D,E,F ,0,1,2, 第二进制最后一位都有变化的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-29 17:08:13 | 显示全部楼层
本帖最后由 lark 于 2015-7-29 17:09 编辑


感觉回答和我的问题不一样?我一直搞不懂
这是正常的代码,我修改的:
#include<stdio.h>
#include<stdlib.h>

int main(void){
        int i=-3;
        char buffer[32];
        
                //char buffer[3];
                //这里的改动会造成数据溢出;将32个1或0存入只有3byte大小的buffer中,
        //怎么可能? 
        
        struct bin{
                signed char n:1;        
        }use;
        
        //DEC&BIN mode;
        while(i<=3){
                use.n=i;
                itoa(use.n,buffer,2);
                      printf("【use.n=%2d 【数值i=%d\n【use.n二进制=%s \n\n",use.n,i,buffer);
                i++;
        }
        putchar('\n');
        i=-3;
        
        //HEX mode;
        while(i<=3){
                use.n=i;
                printf("【use.n=%2d; sue.n的HEX:%8X ;   Num %2d的HEX:%8X\n",use.n,use.n,i,i);
                i++;        
        }
        putchar('\n');
        return 0;
}
运行结果:
【use.n=-1 【数值i=-1
【use.n二进制=11111111111111111111111111111111

【use.n= 0 【数值i=0
【use.n二进制=0

【use.n=-1 【数值i=1
【use.n二进制=11111111111111111111111111111111

【use.n= 0 【数值i=2
【use.n二进制=0

【use.n=-1 【数值i=3
【use.n二进制=11111111111111111111111111111111


【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num -3的HEX:FFFFFFFD
【use.n= 0; sue.n的HEX:       0 ;   Num -2的HEX:FFFFFFFE
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num -1的HEX:FFFFFFFF
【use.n= 0; sue.n的HEX:       0 ;   Num  0的HEX:       0
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num  1的HEX:       1
【use.n= 0; sue.n的HEX:       0 ;   Num  2的HEX:       2
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num  3的HEX:       3

请按任意键继续. . .
之后,我将buffer[32]改成buffer[3];
运行结果:
【use.n=-1 【数值i=825307441
【use.n二进制=11111111111111111111111111111111


【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num -3的HEX:FFFFFFFD
【use.n= 0; sue.n的HEX:       0 ;   Num -2的HEX:FFFFFFFE
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num -1的HEX:FFFFFFFF
【use.n= 0; sue.n的HEX:       0 ;   Num  0的HEX:       0
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num  1的HEX:       1
【use.n= 0; sue.n的HEX:       0 ;   Num  2的HEX:       2
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num  3的HEX:       3

请按任意键继续. . .

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 05:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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