繁体   English   中英

char和ASCII码之间的关系?

[英]Relationship between char and ASCII Code?

我的计算机科学老师告诉我们,要声明哪种数据类型取决于所需变量的值大小。 然后,他演示了使用char加减数字来输出不同的char。 我记得他说过这与ASCII码有关。 谁能更具体,清楚地解释这一点? 那么,将char视为数字(因为我们可以用它进行数学运算)还是一个字符或两者兼而有之? 我们可以打印出一个字符后面的数字吗?

那么,将char视为数字或字符还是两者兼而有之?

都。 它是一个整数,但是该整数值表示一个字符,如系统的字符编码所描述。 您的计算机科学老师使用的系统的字符编码恰好是ASCII。

我们可以打印出一个字符后面的数字吗?

C ++(以前曾被标记为问题):

字符输出流(例如std::cout )的行为是在插入char类型的整数时打印所表示的字符。 但是,所有其他整数类型的行为是打印整数值。 因此,您可以通过将char的整数值转换为另一种整数类型来打印它:

std::cout << (unsigned)'c';

C:

没有模板输出流,因此您无需将其显式转换为另一个整数(有符号性除外)。 您需要的是printf的正确格式说明符:

printf("%hhu", (unsigned char)'c');

hhchar类型的整数, u是unsigned的,因为您可能对unsigned表示形式感兴趣。

char可以容纳一个数字,它是计算机上可用的最小整数类型,并且必须至少具有 8位。 它是一个字节的同义词。

它的典型用法是存储字符代码。 计算机只能处理数字,因此,为了表示字符,使用数字。 当然,您必须同意哪个数字表示哪个字符。

C不需要特定的字符编码 ,但是如今大多数系统都使用ASCII的超集(这是仅使用7位的非常老的编码),例如UTF-8。

所以,如果你有一个char保存一个字符,您添加或减去一定的价值,其结果将是,恰好是一个不同的字符代码另一个号码。

在ASCII,字符0 - 9a - zA - Z具有相邻的码点,因此通过添加例如2至A ,其结果将是C

我们可以打印出一个字符后面的数字吗?

当然。 这仅取决于您将char的值解释为数字还是字符代码。 例如与printf

printf("%c\n", 'A');                   // prints the character
printf("%hhu\n", (unsigned char)'A');  // prints the number of the code

仅因为char允许对char进行签名或取消签名,才需要将其强制转换为(unsigned char) ,我们希望在此处将其视为未签名的。

char占用单个字节。 在具有8位字节的系统上,这使其具有-128到127的范围(假定char是带符号的)。您可以按以下方式打印此值:

char a = 65;
printf("a=%d\n", a);

输出:

65

%d格式说明符将其参数输出为十进制整数。 另一方面,如果您使用%c格式说明符,则会打印与该值关联的字符。 在使用ASCII的系统上,这意味着它将打印与该数字关联的ASCII字符:

char a = 65;
printf("a=%c\n", a);

输出:

A

在这里,字符A被打印,因为65是A的ASCII码。

您可以对这些数字执行算术运算,并为所得代码打印字符:

char a = 65;
printf("a=%c\n", a);
a = a + 1;
printf("a=%c\n", a);

输出:

A
B

在此示例中,我们首先打印出A ,它是代码为65的ASCII字符。然后我们加1得到66。然后我们打印出66的ASCII字符,即B

每个变量都以二进制(即作为数字) char存储,只是特定大小的数字。

当使用某些字符编码进行编码时,它们表示一个字符,此处为ASCII标准( www.asciitable.com )。

@Igor注释中所示 ,如果您运行以下代码; 您会看到char的ASCII字符,十进制和十六进制表示形式。

char c = 'A'; 
printf("%c %d 0x%x", c, c, c);

输出:

A 65 0x41

为了更好地理解它,您可以制作一个程序自己生成ASCII表。

我的计算机科学老师告诉我们,要声明哪种数据类型取决于所需变量的值大小。

这是对的。 不同的类型可以代表不同的值范围。 作为参考,以下是各种整数类型以及它们必须能够表示的最小范围:

Type                             Minimum Range
----                             -------------
signed char                       -127...127
unsigned char                        0...255
char                same as signed or unsigned char, depending on implementation
short                           -32767...32767
unsigned short                       0...65535
int                             -32767...32767
unsigned int                         0...65535
long                       -2147483647...2147483647
unsigned long                        0...4294967295
long long         -9223372036854775807...9223372036854775807
unsigned long long                   0...18446744073709551615

在给定类型中,实现可能表示更大的范围; 例如,在大多数现代实现中, int的范围与long的范围相同。

C并没有为基本整数类型规定固定的大小(位宽)(尽管无符号类型的大小与它们的等效符号大小相同); 在最初开发C时,字节和字的大小可能会在体系结构之间变化,因此更容易指定类型必须表示的最小值范围,并将其留给实现者以弄清楚如何将其映射到硬件上。

C99引入了stdint.h标头,该标头定义了固定宽度类型,例如int8_t (8位), int32_t (32位)等,因此您可以根据需要定义具有特定大小的对象。

那么,将char视为数字(因为我们可以用它进行数学运算)还是一个字符或两者兼而有之?

char是一种整数数据类型,可以表示至少[0...127] 1范围内的值,该范围是基本执行字符集的编码范围(大写和小写拉丁字母, 09十进制数字,和常见的标点符号)。 它可以用于存储小整数值并进行常规算术运算,但这不是典型的用例。

您可以将char对象打印为字符或数字值:

#include <limits.h> // for CHAR_MAX
...
printf( "%5s%5s\n", "dec", "char" );
printf( "%5s%5s\n", "---", "----" );

for ( char i = 0; i < CHAR_MAX; i++ )
{
  printf("%5hhd%5c\n", i, isprint(i) ? i : '.' );
}

该代码将打印出整数值和关联的字符,如下所示(这是ASCII,这是我的系统使用的字符):

...
65    A
66    B
67    C
68    D
69    E
70    F
71    G
72    H
73    I 
...

SOHEOT类的控制字符没有关联的打印字符,因此对于这些值,上面的代码仅打印出一个'.'

根据定义, char对象占用一个存储单元 (字节); 单个存储单元中的位数必须至少为 8,但可以更多。


  1. 普通char可能是带符号的也可以是无符号的,具体取决于实现方式,因此它可以表示该范围之外的其他值,但是它必须能够(至少)表示这些值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM