整型变量(整数变量)是数值可以改变的整数类型的变量。在C语言中,整型变量的值可以是十进制,八进制,十六进制,但在内存中存储着是二进制数。
一)整数数据类型在计算机中的储存
在C语言中,整型变量的值可以是十进制,八进制,十六进制,但在内存中存储着的是二进制数。
1.正整数在计算机中的存储方式
以十进制65为例,先把65转换成二进制数。1000001,具体十进制转换成二进制的方法,请看该链接。
2.负整数在计算机中的存储方式
我们需要明确有符号整数在计算机中的三种表示方法:
原码、反码、补码
注意三种表示方法均有符号位和数值位两部分,符号位0表示正1表示负
对于正数,原码反码补码均相同,为对应的二进制
对于负数来说 原码是对应的二进制
反码是保持符号位不变,其他位按位取反(即0变1,1变0)
补码是在反码的基础上加1
C语言支持有符号和无符号文字。
二)字符数据类型:
字符类型指的是单个字符,类型声明使用char
关键字。
char c = 'B';
C 中的单个字符是“char”类型数据。 字符存储在 8 位或 1 字节的内存中,并且该字符也可以是有符号和无符号的。C 语言中没有专门的“字符类型”。 char 与整数类型相同。
char 只是一个最小的整数类型。 因此,与任何其他整数类型一样,它可以是有符号或无符号的。
char 1 byte −128 to 127
signed char 1 byte −128 to 127
unsigned char 1 byte 0 to 255
有符号和无符号字符都会根据其 ASCII 值存储单个字符。 例如,’A’ 将被存储为 65。我们不需要指定关键字’signed’来使用signed char。
//Both are same
signed char name = ‘a’;
char name = ‘a’;
但是必须使用关键字“unsigned”来使用无符号字符。
unsigned char name = ‘a’;
在计算机内部,字符类型使用一个字节(8位)存储。C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。每个字符对应一个整数(由 ASCII 码确定),比如B
对应整数66
。
字符类型在不同计算机的默认范围是不一样的。一些系统默认为-128
到127
,另一些系统默认为0
到255
。这两种范围正好都能覆盖0
到127
的 ASCII 字符范围。ASCII 表包含从 0 到 127 的 128 个字符值,其余 127 个字符称为扩展 ASCII 字符集。
例1.1 字符以整数方式输入,以整数方式输出
char c = 66; // 等同于
char c = 'B';
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a = 'B';
char b = 66;
printf("a=%d|b=%d\n", a,b);
return 0;
}
只要在字符类型的范围之内,整数与字符是可以互换的,都可以赋值给字符类型的变量。
上面示例中,变量c
是字符类型,赋给它的值是整数66。这跟赋值为字符B
的效果是一样的。
例1.2 字符以整数方式输入,以字符方式输出
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a = 'B';
char b = 66;
printf("a=%c|b=%c\n", a,b);
return 0;
}
两个字符类型的变量可以进行数学运算。
char a = 'B'; // 等同于 char a = 66;
char b = 'C'; // 等同于 char b = 67;
printf("%d\n", a + b); // 输出 133
上面示例中,字符类型变量a
和b
相加,视同两个整数相加。占位符%d
表示输出十进制整数,因此输出结果为133。
在有符号字符扩展集中,从 -128 到 -1 取值,而在无符号字符中,它从 128 到 255 取值。当你尝试给有符号字符赋值 128 时,它会像顺时针一样取 -128 值。
同样,如果给 unsigned char 赋值 256,它将取值为 0。
例2:unsigned char的溢出
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned char a = 256;
printf("chartype a=%c\n", a);
printf("integertype a=%d\n", a);
return 0;
}
三)字符常量
字符常量的分类
普通的字符常量
char t = '\'';
转义字符常量
上面示例中,变量t
为单引号字符,由于字符常量必须放在单引号里面,所以内部的单引号要使用反斜杠转义。
这种转义的写法,主要用来表示 ASCII 码定义的一些无法打印的控制字符,它们也属于字符类型的值。
\a
:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。\b
:退格键,光标回退一个字符,但不删除字符。\f
:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v
。\n
:换行符。\r
:回车符,光标移到同一行的开头。\t
:制表符,光标移到下一个水平制表位,通常是下一个8的倍数。\v
:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。\0
:null 字符,代表没有内容。注意,这个值不等于数字0。
转义写法还能使用八进制和十六进制表示一个字符。
\nn
:字符的八进制写法,nn
为八进制值。\xnn
:字符的十六进制写法,nn
为十六进制值。
char x = 'B';
char x = 66;
char x = 0102; // 八进制
char x = '\x42'; // 十六进制
上面示例的四种写法都是等价的
例3:转义字符的应用
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a = 'B';
char b = 66;
char c = 0102;
char d = '\x42';
printf("chartype a=%d\n", a);
printf("dectype b=%d\n", b);
printf("octtype c=%d\n", c);
printf("hextype d=%d\n", d);
return 0;
}
以上示例你也可以把‘%d’换成‘%o’或者’%0x 输出八进制和十六进制数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a = 'B';
char b = 66;
char c = 0102;
char d = '\x42';
printf("chartype a=%d\n", a);
printf("dectype b=%d\n", b);
printf("octtype b=%o\n", b);
printf("octtype c=%d\n", c);
printf("octtype c=%o\n", c);
printf("hextype d=%d\n", d);
printf("hextype d=%o\n", d);
printf("hextype d=%0x\n", d);
return 0;
}