C语言无符号数为什么取值范围0开头

Python013

C语言无符号数为什么取值范围0开头,第1张

首先这里是无符号和有符号之间的区别,

在这里我们将他们实现为二进制后,

楼主你会更好的理解他们之间的区别,

而且这部分的题目是面试题常考的

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位对应一位.你自己查.