lark 发表于 2015-7-23 19:10:44

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

插入代码:(问题在代码的注释里面)

#include<stdio.h>
#include<stdlib.h>

int main(void){
        int i=-3;
        char str; //这里和问题相关
       
        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=%2di=%2d bin:%s\n",use.n,i,str);
                i++;       
        }
        return 0;
}

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


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

yjip267 发表于 2015-7-23 19:10:45

int i=-3;定义成全局变量。应该不会这样。好像是堆栈出问题了。

yjip267 发表于 2015-7-24 09:23:37

本帖最后由 yjip267 于 2015-7-24 09:25 编辑

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

weisuo 发表于 2015-7-26 12:11:37

我是知道的

weisuo 发表于 2015-7-26 12:12:19

00000

weisuo 发表于 2015-7-26 12:12:57

大哥啊啊啊

weisuo 发表于 2015-7-26 12:13:54

大哥啊

lark 发表于 2015-7-27 16:25:29

weisuo 发表于 2015-7-26 12:13
大哥啊

{:9_229:} 不好意思,我一天只上一次论坛,或者几天上一次论坛,回复也就慢了。。。

lark 发表于 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的数值会发生变化?

lark 发表于 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;
        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
请按任意键继续. . .

yjip267 发表于 2015-7-28 10:33:23

while(i<=3)
{
                use.n=i;
                itoa(use.n,str,2);
                printf("use.n=%2di=%2d bin:%s\n",use.n,i,str);
                i++;      
      }
其中i的值从-3到2,十六进制0xfffffffd,0xfffffffe,0xfffffff,0,1,2,而D,E,F ,0,1,2, 第二进制最后一位都有变化的。

lark 发表于 2015-7-29 17:08:13

本帖最后由 lark 于 2015-7-29 17:09 编辑

yjip267 发表于 2015-7-28 10:33
while(i

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

int main(void){
      int i=-3;
      char buffer;
      
                //char buffer;
                //这里的改动会造成数据溢出;将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 ;   Num0的HEX:       0
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num1的HEX:       1
【use.n= 0; sue.n的HEX:       0 ;   Num2的HEX:       2
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num3的HEX:       3

请按任意键继续. . .

之后,我将buffer改成buffer;
运行结果:
【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 ;   Num0的HEX:       0
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num1的HEX:       1
【use.n= 0; sue.n的HEX:       0 ;   Num2的HEX:       2
【use.n=-1; sue.n的HEX:FFFFFFFF ;   Num3的HEX:       3

请按任意键继续. . .


页: [1]
查看完整版本: 数组空间的大小和二进制的打印,位域