char和ASCII代码之间的关系?

我的计算机科学老师告诉我们要声明的数据类型取决于所需变量值的大小。 然后他演示了添加char并减去一个数字以输出不同的char。 我记得他说这与ASCII代码有关。 任何人都能更清楚地解释这一点吗? 因此,char是一个数字(因为我们可以用它来做数学)或一个字符或两者兼而有之? 我们可以打印出char后面的数字吗?怎么样?

那么,char是一个数字还是一个字符或两者兼而有之?

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

我们可以打印出char后面的数字吗?怎么样?

C ++(作为用于标记的问题):

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

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

C:

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

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

hh用于大小为char整数, u用于无符号,因为您可能对无符号表示感兴趣。

char可以包含一个数字,它是您机器上可用的最小整数类型,并且必须至少有 8位。 它是一个字节的同义词。

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

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

因此,如果您有一个包含字符的char并且您添加或减去某个值,则结果将是另一个恰好是不同字符的代码。

在ASCII中,字符0azAZ具有相邻的代码点,因此通过将例如2添加到A ,结果将是C

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

当然。 它只取决于您是否将char的值解释为数字或字符的代码。 例如,使用printf

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

仅需要转换为(unsigned char)因为char可以是signed或unsigned,我们希望在此处将其视为unsigned。

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标准( http://www.asciitable.com )就在这里。

与@Igor注释一样 ,如果运行以下代码; 你会看到你的char的ASCII字符,十进制和hex表示。

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

输出:

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  // 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对象占用一个存储单元 (byte); 单个存储单元中的位数必须至少为 8,但可能更多。


  1. Plain char可以是signed或unsigned,具体取决于实现,因此它可以表示该范围之外的其他值,但它必须能够表示*至少*这些值。