Menu Close

整数在计算机中的储存, 字符数据类型,字符变量,字符常量及转义字符常量

整型变量(整数变量)是数值可以改变的整数类型的变量。在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

字符类型在不同计算机的默认范围是不一样的。一些系统默认为-128127,另一些系统默认为0255。这两种范围正好都能覆盖0127的 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

上面示例中,字符类型变量ab相加,视同两个整数相加。占位符%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;
}

 

三)字符常量

所谓字符常量,就是用英文单引号括起来的一个字符。在使用字符常量时应该注意:
1.单引号内的大小写字符代表不同的字符常量,例如‘Y’、‘y’是两个不同的字符常量。
2.字符常量只能用英文单引号括起来,不能用双引号。例如“Y”不是一个字符常量,而是一个字符串。
3.单引号内如果是一个空格符,也是一个字符常量。
4.单引号内只能包含1个字符,‘xyz’写法是错误的。但超过1个的字符的话,除最后一个外前面的会自动失效,当然这在编程使用中应该避免。
5.字符常量的值,就是它在ASCII编码表中的值。是个从0—127之间的整数。
因此字符常量可以作为整型数据来进行运算。例如:
表达式‘Y’+32的值为121,也就是‘y’的值。
表达式‘7’+‘6’的值为109,通过查表可以发现,刚好是‘m’的值。应该注意‘7’和7是不一样的,作为字符常量所代表的整型常量值是55,后者是整型常量7。

字符常量的分类

普通的字符常量

用单撇号括起来的一个字符就是字符常量。如‘a’,‘#’,‘%’,‘D’是合法的字符常量,在内存中占一个字节。注意:
1、字符常量只包括一个字符,如‘AB’是不合法的。
2、字符常量区分大小写字母,如’A’和‘a’是两个不同的字符常量。
3、撇号(’)是定界符,而不属于字符常量的一部分。如:’a’ 输出的是一个字母“a”,而不是3个字符“‘a’”。撇号本身也是一个字符,如果要表示这个字符常量,必须使用反斜杠转义(转义字符)。
char t = '\'';

转义字符常量

除了字符常量外,C还允许用一种特殊形式的字符常量,就是以“\”开头的字符序列。称为转义字符。

上面示例中,变量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;
}
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in C语言教程

Related Posts