c语言负数
⑴ c语言问题,为什么会输出负数
这个问题有多种可能,不一而足。
算法有错误,最终计算结果是负数。输出自然会是负数。
例如:
inta=1;
intb=a-2;
printf("b=%d",b);
//输出结果:b=-1超过变量类型的最大取值范围,发生溢出。
例如Turbo C里int是16位,取值范围-32768~32767。如果计算过程当中,数值超过32767,由于补码的关系。结果就有可能是负数。这种情况,就需要使用取值范围更大的数据类型。
例程:
#include<stdio.h>
voidmain(){
inta,b,ch;
a=32767;
b=a+1;
printf("a=%d,b=%d",a,b);
ch=getch();
}
//输出结果:a=32767,b=-32768
⑵ c语言负数的++等于多少
负数是有符号位的,在计算机中以补码的形式储存,最高位为1表示负数,其余位按位取反再加1,然后你再把二进制转换成8进制和16进制就可以了。
在c语言中,你可以用printf("%x",-617);输出16进制
用printf("%o",-617);输出8进制
⑶ c语言负数可以求余吗
可以哦,n%m, 结果无论是正数还是负数,值是一样的,不过符号与n一样,符号与m无关。只是很少这样用,我暂时也想不出有什么要这样做哦~~
⑷ C语言 !(一个负数)等于啥
可以,但是结果会出错,负数在计算机中最高位为1,作为符号标志(正数为0),但是如果赋给无符号整型变量,最高位的标志位就会变成数值位,计算时把这个1当成数值。
⑸ C语言 负号问题
只能是在程序里判断‘-’这个字符。你需要能够判断出‘-’是一个减号还是一个负号。
比较简单的方法是,输入计算式时你规定好格式,负数一律用()括起来。这样比较容易判断是不是负数。当然你也可以定义其它的格式。
如果不规定格式的话,判断方法稍微麻烦一点,你要判断‘-’前面是什么,如果是数字,那么 ‘-’为减号,如果是‘)’,那么‘-’为减号,如果是‘+-*/’号,那么‘-’为负号。如果什么也没有,那么表明是起始数字,那么‘-’为负号。等等,需要考虑周全。
=======下面是一个例子==============
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#define maxlen 100
typedef struct node{
char ch;
int data;
struct node *next;
}LinkList;//保存表达式的链表
int func()
{
LinkList *ta,*tb,*tc,*td;
ta = La;
tc = Lb;
for(int n=0;n < i;n++)
{
ta=ta->next;
}
tb = ta;
for(n=0; n < Len; n++)
{
tb=tb->next;
}
ta->next = tb;
for(n=0; n < j; n++)
{
tc=tc->next;
}
td = tc->next;
tc->next =
}
typedef struct{
char stack[maxlen];
int top;
}Stack1;
typedef struct{
int stack[maxlen];
int top;
}Stack2;
int In(char c){
if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='#')||(c=='(')||(c==')')||(c=='A')||(c=='S'))
return 1;
else
return 0;
}
void InitStack1(Stack1 *S){
S->top=-1;
}
void InitStack2(Stack2 *S){
S->top=-1;
}
void Push1(Stack1 *S,char ch){
S->top++;
S->stack[S->top]=ch;
}
void Push2(Stack2 *S,int ch){
S->top++;
S->stack[S->top]=ch;
}
char Precede(char ch1,char ch2){//比较两个运算符的优先级
char ch;//当ch为<时表示ch1的优先级要小于ch2,反之同理
switch(ch1){
case '+':if((ch2=='*')||(ch2=='/')||(ch2=='(')) ch='<';else ch='>';break;
case '-':if((ch2=='*')||(ch2=='/')||(ch2=='(')) ch='<';else ch='>';break;
case '*':if((ch2=='(')) ch='<';else ch='>';break;
case '/':if((ch2=='(')) ch='<';else ch='>';break;
case '#':if(ch2=='#') ch='=';else ch='<';break;
case '(':if(ch2==')') ch='=';else ch='<';break;
}
return ch;
}
void Pop1(Stack1 *S,char *p){
*p=S->stack[S->top];
S->top--;
}
void Pop2(Stack2 *S,int *p){
*p=S->stack[S->top];
S->top--;
}
char GetTop1(Stack1 *S){
return S->stack[S->top];
}
int GetTop2(Stack2 *S){
return S->stack[S->top];
}
void print1(Stack1 *s){
printf("运算符栈: ");
int h=s->top;
while(h!=-1){
printf("%c ",s->stack[h]);
h--;
}
printf("\n");
}
void print2(Stack2 *s){
printf("数字符栈: ");
int h=s->top;
while(h!=-1){
printf("%c ",s->stack[h]);
h--;
}
printf("\n");
}
int Operate(int a,char theta,int b){//对a和b进行运算
int s;
switch(theta){
case '+':s=a+b;break;
case '-':s=a-b;break;
case '*':s=a*b;break;
case '/':s=a/b;break;
}
return s;
}
LinkList *CreatList(){
LinkList *H,*s,*r;
H=(LinkList*)malloc(sizeof(LinkList));
H->next=NULL;
r=H;
char c;
c=getchar();
while(c!='#'){
s=(LinkList*)malloc(sizeof(LinkList));
s->ch=c;s->next=NULL;
r->next=s;r=s;
c=getchar();
}
s=(LinkList*)malloc(sizeof(LinkList));
s->ch=c;s->next=NULL;
r->next=s;r=s;
return H;
}
LinkList *Change(LinkList *H){
LinkList *p,*pre;p=H->next;pre=H;
while(p!=NULL){
if(In(p->ch)){p=p->next;pre=pre->next;}
else{ //将字符转化成数字
int m=0,n;
while(!In(p->ch)){
n=p->ch-'0';
m=10*m+n;
LinkList *u=p;
p=p->next;
if(!In(p->ch)){ pre->next=p;free(u); }
else{ u->data=m;u->ch='@';pre=pre->next; }//@标志此节点内的符号为数字
}
}
}
return H;
}
LinkList *jisuan(LinkList *H){//对链表中的数据进行初步的计算
LinkList *p,*U,*pre;
p=H->next;pre=H;int a;
while(p!=NULL){
if(p->ch!='A'&&p->ch!='S'){
pre=pre->next;
p=p->next;
}
else{
if(p->ch=='A')
a=fabs(p->next->data);
else
a=sqrt(p->next->data);
p->next->data=a;
U=p;
p=U->next;
pre->next=p;
free(U);
}
}
return H;
}
int main(int argc, char* argv[])
{
printf("*******************************************************************************");
printf("\n");
printf(" 欢迎使用模拟计算器程序\n");
printf("*******************************************************************************");
Stack1 OPTR1,*OPTR=&OPTR1;
Stack2 OPTR2,*OPND=&OPTR2;
InitStack1(OPTR);
Push1(OPTR,'#');//将‘#’压入OPTR栈中
InitStack2(OPND);
char c,x,theta;
int a,b,s;
printf("请输入表达式,以#结束:");
LinkList *H,*p,*q;
H=CreatList();
H=Change(H);
H=jisuan(H);
p=H->next;
c=p->ch;
while((c!='#')||(GetTop1(OPTR)!='#')){//#同时是表达式的截止符
if(c=='@'){
s=p->data;
Push2(OPND,s);
p=p->next;
c=p->ch;
}
else
switch(Precede(GetTop1(OPTR),c)){
case '<':Push1(OPTR,c);p=p->next;c=p->ch; break;
case '=':Pop1(OPTR,&x); p=p->next;c=p->ch; break;
case '>':Pop1(OPTR,&theta); Pop2(OPND,&b); Pop2(OPND,&a);
Push2(OPND,Operate(a,theta,b));break;
//Operate之后,对C继续判断,所以不用getchar()
}
}
s=GetTop2(OPND);
printf("结果为:");
printf("%d\n",s);
return 0;
}
⑹ C语言如何把负数转化为正数
需要准备的材料分别有:电脑、C语言编译器。
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。
⑺ C语言,负值运算
第一、 浮点数 不建议用自增 ++ 、自减 -- 运算
第二、你的 f 是从 -1 开始的, 你用 f ++ 之后 f 就是 零, 你不可以除以零哦。
⑻ 请问C语言是怎么计算负数取余的
C语言计算负数取余:符号内的被除数决定,就是计算式中的-7,7,-7决定:比如-7%5=-2;
7%-5=2;
-7%-5=-2;
负数取余的原理:
任何一个整数n都可以表示成n=k*q+r其中0<=|r|<|q|这里的r就是n除以q的余数,即r==n%q例如:-9=(-2)*4+(-1)则-9除以4的余数为-1。
求余:取整除后的余数。
求模:基本意义和求余相同,不过要求a%b中的b不是负数。
(8)c语言负数扩展阅读
C语言除法运算符“/”和求余运算符“%”
除法运算符“/”。二元运算符,具有左结合性。参与运算的量均为整型时,结果为整型,舍去小数。如果运算量中有一个为实型,结果为双精度实型。
例如:
5/2=2,1/2=0
5/2.0=2.5
求余运算符“%”,二元运算符,具有左结合性。参与运算的量均为整型。求余运算的结果等于两个数相除后的余数。
⑼ C语言负数的表达
和其前后的其他语句有关,没有代码说不清。
补充代码后,继续回答:
你的程序中
for (c=1;c<=20;++c)
{
k = (float)(a)/b + k;
c = a;
a = a + b;
b = -c;
}
这段循环中,在}前加上printf("%d ", c);,你会发现 C值依次为2,3,1,-2,-3,-1,2,3,1...死循环。
可改成
t=1;
while (c<=20)
{ k = t*(float)(a)/b + k;
c = a;
a = a + b;
b = c;
t=-1*t;
}
⑽ c语言中负数如何表示
c语言中负数表示方法就是在数前加负号“-”,比如:
-5,-10000,等
一个变量赋值为负数也是如此,比如:
x=-1000;