① c语言中负数如何表示
c语言中负数表示方法就是在数前加负号“-”,比如:
-5,-10000,等
一个变量赋值为负数也是如此,比如:
x=-1000;
② 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语言关系运算中负数是按0还是按1
0001
取反
1110
符号位为1,取反+1为
1010
转化成10进制为
-2
正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码
1100110011原
1011001100反除符号位,按位取反
1011001101补除符号位,按位取反再加1
正数的原反补是一样的
在计算机中,数据是以补码的形式存储的:
在n位的机器数中,最高位为符号位,该位为零表示为正,为1表示为负;
其余n-1位为数值位,各位的值可为0或1。
当真值为正时:原码、反码、补码数值位完全相同;
当真值为负时:
原码的数值位保持原样,
反码的数值位是原码数值位的各位取反,
补码则是反码的最低位加一。
注意符号位不变。
如:若机器数是16位:
十进制数17的原码、反码与补码均为:0000000000010001
十进制数-17的原码、反码与补码分别为:1000000000010001、1111111111101110、1111111111101111
④ c语言中的特殊符号什么意思代表什么
expr :表达式lvalue:左值得(书上是:标示非常量的表达式)type:类型class_name:类名member:成员名pointer:指针表达式—————————————————————————————————————————————————————————优先性级:1-----------------------------------------------------------------------------------------------------------------------------------名称:例子:作用域解析class_name::member作用域解析namespace_name::member全局::name全局::qualifide-name—————————————————————————————————————————————————————————优先性级:2-----------------------------------------------------------------------------------------------------------------------------------成员选择object.member成员选择pointer->member下标pointer[expr]函数调用expr(expr_list)值构造type(expr_list)后增量lvalue++后减量lvalue--类型识别typeid(type)运行时类型识别typeid(expr)运行时检查的转换dynamic_cast<type>(expr)编译时检查的转换static_cast<type>(expr)不检查检查的转换reinterpret_cast<type>(expr)const转换 const_cast<type>(expr)—————————————————————————————————————————————————————————优先性级:3-----------------------------------------------------------------------------------------------------------------------------------对象的大小sizeof expr类型的大小sizeof(type)前增量 ++lvalue后增量 - -lvalue补~expr非!expr一元负号 -expr一元正号 +expr地址&lvalue间接* expr建立(分配)new type建立(分配并初始化)new type(expr-list)建立(放置)new (expr-list)type建立(放置并初始化)new (expr-list)type(expr-list)销毁delete pointer销毁数组delete [] pointer强制(type)expr—————————————————————————————————————————————————————————优先性级:4-----------------------------------------------------------------------------------------------------------------------------------成员选择object .*pointer-to -member成员选择object->*pointer-ro -member—————————————————————————————————————————————————————————优先性级:5-----------------------------------------------------------------------------------------------------------------------------------乘expr * expr除expr / expr取模(余数)expr % expr加(求和)expr + expr减expr - expr—————————————————————————————————————————————————————————优先性级:6-----------------------------------------------------------------------------------------------------------------------------------左移expr<<expr右移expr>>expr—————————————————————————————————————————————————————————优先性级:7-----------------------------------------------------------------------------------------------------------------------------------小于expr<expr小于等于expr<=expr大于expr>expr大于等于expr>=expr—————————————————————————————————————————————————————————优先性级:8-----------------------------------------------------------------------------------------------------------------------------------等于expr ==expr不等于expr != expr—————————————————————————————————————————————————————————优先性级:9-----------------------------------------------------------------------------------------------------------------------------------按位“异或”expr ^ expr—————————————————————————————————————————————————————————优先性级:10-----------------------------------------------------------------------------------------------------------------------------------按位“与”expr & expr—————————————————————————————————————————————————————————优先性级:11-----------------------------------------------------------------------------------------------------------------------------------按位“或” expr | expr—————————————————————————————————————————————————————————优先性级:12-----------------------------------------------------------------------------------------------------------------------------------逻辑“与”expr && expr—————————————————————————————————————————————————————————优先性级:13-----------------------------------------------------------------------------------------------------------------------------------逻辑“或”expr || expr—————————————————————————————————————————————————————————优先性级:14-----------------------------------------------------------------------------------------------------------------------------------条件表达式expr? expr :expr—————————————————————————————————————————————————————————优先性级:15-----------------------------------------------------------------------------------------------------------------------------------简单赋值lvalue =expr乘并赋值lvalue *= expr除并赋值lvalue/= expr取模并赋值lvalue % =expr加并赋值lvalue += expr减并赋值lvalue-= expr左移并赋值lvalue<<= expr右移并赋值lvalue >>=expr与并赋值lvalue & =expr或并赋值lvalue |=expr异或并赋值lvalue ^=expr—————————————————————————————————————————————————————————优先性级:16-----------------------------------------------------------------------------------------------------------------------------------异常抛出throw expr—————————————————————————————————————————————————————————优先性级:17-----------------------------------------------------------------------------------------------------------------------------------逗号(序列)expr,expr—————————————————————————————————————————————————————————
⑤ 在C语言中0减1为什么是11
前面那个一是符号位,1代表负号,所以11是-1的意思,同样01就是+1,明白了吧,呵呵
⑥ C语言符号全集合
c语言运算符号:
1级优先级 左结合
() 圆括号
[] 下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符
2级优先级 右结合
! 逻辑非运算符
~ 按位取反运算符
++ 自增运算符
-- 自减运算符
- 负号运算符
(类型) 类型转换运算符
* 指针运算符
& 地址与运算符
sizeof 长度运算符
3级优先级 左结合
* 乘法运算符
/ 除法运算符
% 取余运算符
4级优先级 左结合
+ 加法运算符
- 减法运算符
5级优先级 左结合
<< 左移运算符
>> 右移运算符
6级优先级 左结合
<、<=、>、>= 关系运算符
7级优先级 左结合
== 等于运算符
!= 不等于运算符
8级优先级 左结合
& 按位与运算符
9级优先级 左结合
^ 按位异或运算符
10级优先级 左结合
| 按位或运算符
11级优先级 左结合
&& 逻辑与运算符
12级优先级 左结合
|| 逻辑或运算符
13级优先级 右结合
? : 条件运算符
14级优先级 右结合
=+ =- =*
=/ =% =
>= < <=
&= ^= |= 全为赋值运算符
15级优先级 左结合
, 逗号运算符
⑦ c语言,大括号那里,负1怎么来的
因为,255,就是 -1 的补码。-1 是真值。
[-1]补 = 1111 1111B = 255。
你写上 254,就会输出 -2,
因为,254,就是 -2 的补码。-2 是真值。
你写上 253,就会输出 -3,
因为,253,就是 -3 的补码。
。。。。。。
你可以实验一下,其它数字。
对于 char 变量,你输入任何数字,都是当作补码存入的,
输出时,就都是真值。
如果补码,还没有弄明白,理解这个,比较吃力。
⑧ c语言中负数如何表示
写成10进制 可以直接加负号
写成16进制 最高位为1即可。
负数表示为补码, 最高位为符号位 为1
其它位为原码按位取反加一。
⑨ 在c语言中怎么表示负数。
第一位符号位1为负,0为正。
正数的补码和2进制原码是一样的。
负数的补码:
1、先取绝对值|x|
;
2、对|X|+1
;
3、对|X|+1
取反,就得到它的补码了
。
计算机中存放整型数据都是按补码的形式存放的。
(9)01c语言哪个表示符号负号扩展阅读:
有符号数的表示方法是由硬件决定,而不是由C决定的。有三种表示方法:
1、二进制原码
0000
0001
表示
1
1000
0001
表示
-1
这个方法有个缺点是有两个零:
+0
和
-0。这会引起混淆,而且用两个位组合来表示一个值也有些浪费。
2、二进制补码(最普遍的系统)
区别在于
singned
和
unsigned:
1)如果是无符号字节,
1000
0000
该组合为
128
2)如果是有符号字节,
1000
0000
该组合为
-128
第一种表示数的范围是
0
~
255;
第二种表示数的范围是
-128
~
+127,对于一个二进制补码数取负数,最简单的方法就是取反、加
1。
3、二进制反码
通过反转位组合中的每一位以形成一个数的负数,例如:
0000
0001
表示
1
1111
1110
表示
-1
这种方式也有一个
-0:1111
1111。其范围是
-127
~
+127。
⑩ C语言 !(一个负数)等于啥
可以,但是结果会出错,负数在计算机中最高位为1,作为符号标志(正数为0),但是如果赋给无符号整型变量,最高位的标志位就会变成数值位,计算时把这个1当成数值。