概述
1.为什么c语言中int的取值范围是-32768~~~~32767?
这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为1111111111111111=-(215-1)=-32767 此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0 所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方-1个,比16位二进制能够提供的2的16次方个编码少1个。 但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。 到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。 所以,补码系统中范围是-32768~32767。 因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1.
2.由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的.
类型说明符 | 比特数(字节数) | 有效数字 | 数的范围 |
float | 32(4) | 6~7 | 10-37~1038 |
double | 64(8) | 15~16 | 10-307~10308 |
long double | 128(16) | 18~19 | 10-4931~104932 |
eg:
- main()
- {
- float a;
- double b;
- a=33333.33333;
- b=33333.33333333333333;
- printf("%f\n%f\n",a,b);
- //输出结果为a=33333.332031 b=33333.333333
- //float 有效数字最大7位,故2位小数之后为无效数字;大部分编译器规定小数最多保留6位,其余四舍五入
- }
3.每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。
如x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a,b赋予'x'和'y'值:
a='x'; b='y';
实际上是在a,b两个单元内存放120和121的二进制代码:
a:
0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
b:
0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
4.常用的转义字符及其含义
转义字符 | 转义字符的意义 | ASCII代码 |
n | 回车换行 | 10 |
t | 横向跳到下一制表位置 | 9 |
b | 退格 | 8 |
r | 回车 | 13 |
f | 走纸换页 | 12 |
\ | 反斜线符"" | 92 |
' | 单引号符 | 39 |
” | 双引号符 | 34 |
a | 鸣铃 | 7 |
ddd | 1~3位八进制数所代表的字符 |
|
xhh | 1~2位十六进制数所代表的字符 |
|
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表中的ddd和xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如101表示字母"A" ,102表示字母"B",134表示反斜线,XOA表示换行等。
5.字符串常量和字符常量是不同的量。它们之间主要有以下区别:
1) 字符常量由单引号括起来,字符串常量由双引号括起来。
2) 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
3) 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。这是与BASIC 语言不同的。但是可以用一个字符数组来存放一个字符串常量。
4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"