[清]C 位域/位段/bit field 的一个不太理解的小问题;
插代码,奔主题,不废话:【问题已在注释中,麻烦大家帮我看下;】
#include<stdio.h>
#include<stdlib.h>
//编辑/编译器:C-Free;4.0;
//小心误导,终究理解;
//2013年7月13日02:32:23;
int main(void){
int i=-3;
char str;
typedef struct bin{
int n:1;
int on:1;
int off;//知道为什么可以赋值99吗?因为off是个整型变量,不是位域;
char nul:1;
}Bt;
Bt use;
use.on=0;
use.off=99;
use.nul=1;
printf("on=%d;off=%d;nul=%d;\n\n",use.on,use.off,use.nul);
while(i<=3){
use.n=i;
itoa(use.n,str,2);
/*[问题1:]2进制输出就出现问题了? 改成use.n或i都一样 ,其他进制没问题*/
printf("use.n=%2di=%2d bin:%s\n",use.n,i,str);
i++;
}
return 0;
}
//[问题2:]C语言如何解决int n:233;这样的,问题?
#include<stdio.h>
int main(void){
typedef struct{
int n:33;
}B;
printf("sizeof(B)=%d;\n",sizeof(B));
return 0;
}
/*[问题2延续:] warning: width of `main()::{anonymous struct}::n' exceeds its type;
* 警告:对` main()宽度::{姓名}:结构:N超过它的类型;
*这个提示是不是对超过位域长度的有效提示?
*/
至于第二个问题
一个int为32位 4字节大小 你强行给他开辟33个位阈自然出错
看一下vs2010编译器的说法
如果这样
#include<stdio.h>
int main(void){
typedef struct{
long long n:33;
}B;
printf("sizeof(B)=%d;\n",sizeof(B));
return 0;
}
一个long long默认为8个字节 64位大小 本帖最后由 ryxcaixia 于 2015-7-13 08:58 编辑
#include<stdio.h>
#include<stdlib.h>
//编辑/编译器:C-Free;4.0;
//小心误导,终究理解;
//2013年7月13日02:32:23;
int main(void){
int i=-3;
char str = {0}; // 问题在这里 给缓冲区多开辟点空间
typedef struct bin{
int n:1;
int on:1;
int off;//知道为什么可以赋值99吗?因为off是个整型变量,不是位域;
char nul:1;
}Bt;
Bt use;
use.on=0;
use.off=99;
use.nul=1;
printf("on=%d;off=%d;nul=%d;\n\n",use.on,use.off,use.nul);
while(i<=3){
use.n=i;
itoa(use.n,str,2);
/*[问题1:]2进制输出就出现问题了? 改成use.n或i都一样 ,其他进制没问题*/
printf("use.n=%2di=%2d bin:%s\n",use.n,i,str);
i++;
}
return 0;
}
问题在于str太小 但是赋值的内容太长 导致stack破坏 ryxcaixia 发表于 2015-7-13 08:38
问题在于str太小 但是赋值的内容太长 导致stack破坏
谢谢,:victory:
大神帮忙查下错误 谢谢
#include<stdio.h>void main()
{
double f, p,w,s;
printf("输入P W S\n");
scanf("%d%d%d\n",&p,&w,&s);
if(s<250)
{
f=p*w*s;
printf("%|f\n",f);
}
else if((s>250||s==250)&&s<500)
{
f=p*w*s/0.98;
printf("%|f\n",f);
}
else if((s>500||s==500)&&s<1000)
{
f=p*w*s/0.95;
printf("%|f\n",f);
}
else if((s>1000||s==1000)&&s<2000)
{
f=p*w*s/0.92;
printf("%|f\n",f);
}
else if((s>2000||s==2000)&&s<3000)
{
f=p*w*s/0.9;
printf("%|f\n",f);
}
else
{
f=p*w*s/0.85;
printf("%|f\n",f);
}
}
页:
[1]