在这里我们将他们实现为二进制后,
楼主你会更好的理解他们之间的区别,
而且这部分的题目是面试题常考的
int
a
=
-400
在这里a被定义成了一个有符号的整数,
且值为-400
在计算机中的二进制为
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1110
0111
0000
有符号的解释出来的值为-400,
但是无符号解释出来的值却不同
而printf(“a=%u\n”,a)
很明显这里是要将a按无符号的形式输出(%u)
所以要将a按无符号的形式解释
即将
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1110
0111
0000
解释成无符号的形式
就a值就变成了4294966896
书上解释说使用%u格式控制字符串输出正整数时该数不发生变化,输出负整数时该负整数将被转换为无符号整数输出。
现在这句话的意思已经很明显,
就在计算机中一个数字最终是以二进制存在,
不会改变
但是,
我们可以用有符号或者是无符号的形式去解释他
PS:若有不明白的地方,
可以追问
楼主,
具体方面的原理可以看<<深入理解计算机系统>>中第2章方面的知识,
不需要前缀知识,
直接看就行了。
0开头输入的数字 是 8进制正整数。输入输出格式用%o
变量定义为长整型或整型,考虑数值范围
8进制数,数字可以是 1,2,3,4,5,6,7,0,没有8,9。
#include <stdio.h>
#include <stdlib.h>
void main()
{
long int i,j,k// 变量定义为长整型或整型
printf("Enter data in O -- for example 077 \n")
scanf("%o",&i) // 8进制方式读入 i
k = i + 1 // k 比 i 大 1
printf("%o\n",k) // 打印k的8进制值
printf("%d %d",i,k)// 打印i,k的十进制值
exit(0)
}
输入i: 077 (或77)
打印k的8进制值: 100
打印i,k的十进制值: 63 64
输入i: 0123456 (或123456)
打印k的8进制值: 123457
打印i,k的十进制值: 42798 42799
十进制,逢十进一.也就是说,在一个数里面,某位上的数值不能超过十,超过了就需要进位.二进制,逢二进一.同上,但是二进制每一位最大不能超过2.
八进制.同上,不能超过八.
十六进制,同上,不能超过16.
十进制,共有十个数字:0,1,2,3,4,5,6,7,8,9.
二进制,共有二个数字:0,1.
八进制,共有八个数字:0,1,2,3,4,5,6,7.
十六进制,共有十六个数字:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(a-f就相当于10-15,但是在一个数位上只能用一个数字来表示,所以用a-f).
举例:
0,1这两个数在这4种数字表达方式中都是一样的.
对于3:二进制:11.
对于11:
八进制:13.
十进制:11.
十六进制:b.
对于17:
八进制:21.
十进制:17.
十六进制:11.
计算方法:
对与x进制,每一位的权就是x,把其他进制的数转换成十进制存在以下计算方式.
如果数有n位,从低位到高位,各位分别为a1,a2,...,an:
a1*x^0+a2*x^1+a3*x^2+...+an*x^(n-1)
如二进制:1111
,相当于十进制
2^0+2^1+2^2+2^3=15
十六进制:1abf,相当于
15*16^0+11*16^1+10*16^2+1*16^3=6847
二进制转成八进制、十六进制比较规律,分别为3位、4位对应一位.你自己查.