以下是一个简单的程序
#include<stdio.h>
int main()
{
int n = 1;
while(n > 0):
printf("%d\r\n",n);
n++ ;
return 0;
}
该程序并非死循环,因为c语言中正数是有极限的,即
程序运行一分钟后,达到数字
待程序一直运行,达到数字时停止
c语言数值运算的原理
c语言中,数的乘除并不是数学中的乘除,而是由左移右移解决
每个数,编译器都会将其转换为二进制数,如32->
右移>>相当于除以2
左移<<相当于乘以2
若被乘或被除数为正数,则根据左移右移位数加0,补在后面或前面
若被乘或被除数为负数,则根据左移右移位数加1,补在后面或前面
若将乘以2-->位数左移<< =64 ,
c语言减法运算
计算机内部采用补码来计算的。
A--B 85-23
A+(100--B)--100 85+(100-23)
B+~B=ff 85+77=162
B+~B+1=100 =62 (进位丢失)
~B+1=100--B 求补运算 85-23=62
A+B (A是正数,B是正数)
正数时正常加(Add Normal)
[0001]原 + [0001]原 = [0010]原
A+B (A是正数,B是负数)
此时要把加法变为减法,再拿数值相减
11 + (-6) = [01011]原 + [10110]原 = 1011 - 0110 = 0101 = 5
A+B (A是负数,B是负数)
此时要正常相加数值,最后要保留符号
-3 + (-4)= [10011]原 + [10100]原 = 0011 + 0100 = 0111 = -7
A+neg(B)--100 进位丢失
求补运算是一种运算
补码是一种编码
补码规定了数据的读写双方必须做到以下几点:
1,最高有效位是符号位,0表示正,1表示负
2,当数据是正数的时候,其余各位直接存储其数值
3,当数据是负数的时候吗,其余各位存储其求补后的值
机器数 真值 原码 反码 补码
机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。
机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
八位二进制数由首位符号位和其余七位二进制数组成,范围是-127~+127
S DDDDDDD
+52=0 0
补码:00-->(十六进制)0011 0100-->3 4 内存存档地址 34 00 00 00 正数,高位填0
-52=1 0-->(十六进制)-->c c 内存存档地址 cc ff ff ff 负数,高位填1,转换为十六进制为f
真值:通过机器数最高位0或1判断该真值符号。去最高位,其余位作为新的二进制数,转化为十进制数。此十进制数加上符号,所得数为真值
原码:指一个二进制数左边加上符号位后所得到的码,
反码:正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
补码:正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
补码的好处
在计算机系统中,数值一律用补码来表示和存储。
运算方便
-56 + 12 = [1100 1000]补 + [0000 1100]补 = [1101 0100]补 = -44
28 + (-26)= [0001 1100]补 + [1110 0110]补 = [1 0000 0010]补 = [0000 0010] = 2
进制介绍
十进制
用10个可用符号来表示一个数字
0 1 2 3 4 5 6 7 8 9
如 2 3 5= 2*100+3*10+5*1=2*10^2+3*10^1+5*10^0=200+30+5=235
百位 十位 个位
二进制
用2个可用符号来表示一个数字
0 1
如 1 0 1 1=1*2^3+0*2^2+1*2^1+1*2^0=8+0+2+1=11(相当于十进制下)
八位 四位 二位 个位
八进制
用8个可用符号来表示一个数字
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7(相当于十进制下)
如 2 7 7 (八进制下)=2*8^2+7*8^1+7*8^0=128+56+7=191(相当于十进制下)
十六进制
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15(相当于十进制下)
如 2 A E(十六进制下)=2*16^2+10*16^1+14*16^0
进制转换
十进制转二进制 连除法
如 29(十进制下)
29/2=14~1
14/2=7~0
7/2=3~1
3/2=1~1
1/2=0~1
一个数除以二取商再除,一直除到商为零,其过程中所有余数如上图,反向排列合起来即为所得二进制数11101
即29(十进制下)=11101(二进制下 )
十进制转八进制 方法如上
如 900(十进制下)
900/8=112~4
112/8=14~0
14/8=1~6
1/8=0~1
900(十进制)=16044(八进制)
十进制转十六进制 方法如上
此处不再多述
二进制 八进制 十六进制 相互转换
由于2^3=8,所以每三位二进制可以转换为一位八进制
如(二进制)
分为三部分 10 111 001
001=1*2^0+0*2^1+0*2^2=1
111=1*2^1+1*2^1+1*2^2=7
10=0*2^0+1*2^1=2
所以 (二进制)=271(八进制)
由于2^4=16,所以每四位二进制可以转换为一位十六进制
方法如上同,此处不再多述
其余进制转换,可由上述内容进行推演得到,此处不再赘述
十进制小数表示
abc.ef=a*100+b*10+c*1++e*0.1+f*0.01
=a*10^2+b*10^1+c*10^0+e*10^-1+f*10^-2
c:零位权 b:一位权 a:二位权 e:负一位权 f:负二位权
二进制,八进制,十六进制同上
小数进制转换
十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)
例: (0.625)10= (0.101)2
0.625
X 2
1.25 1
X 2
0.5 0
X 2
1.0 1
知道结果为1停止运算

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/63166.html