我的计算机科学老师告诉我们要声明的数据类型取决于所需变量值的大小。然后他演示了添加char并减去一个数字以输出不同的char。我记得他说这与ASCII代码有关。任何人都能更清楚地解释这一点吗?因此,char是一个数字(因为我们可以用它来做数学)或一个字符或两者兼而有之?我们可以打印出char后面的数字吗?怎么样?
答案 0 :(得分:3)
那么,char是一个数字还是一个字符或两者兼而有之?
两者。它是一个整数,但该整数值表示一个字符,如系统的字符编码所述。您的计算机科学教师使用的系统的字符编码恰好是ASCII。
我们可以打印出char后面的数字吗?怎么样?
C ++(作为用于标记的问题):
字符输出流(例如std::cout
)的行为是在插入类型为char
的整数时打印表示的字符。但是所有其他整数类型的行为是打印整数值。因此,您可以通过将其转换为另一个整数类型来打印char
的整数值:
std::cout << (unsigned)'c';
C:
没有模板化的输出流,因此您不需要显式转换为另一个整数(签名除外)。您需要的是printf
的正确格式说明符:
printf("%hhu", (unsigned char)'c');
hh
用于大小为char
的整数,u
用于无符号,因为您可能对无符号表示感兴趣。
答案 1 :(得分:3)
char
可以包含一个数字,它是您计算机上可用的最小整数类型,且至少 8位。它与字节同义。
它的典型用途是存储字符代码。计算机只能处理数字,因此,为了表示字符,使用数字。当然,你必须就哪个数字意味着哪个角色达成一致。
C并不需要特定的字符编码,但现在大多数系统都使用ASCII的超集(这是一种仅使用7位的非常旧的编码),例如UTF-8。
因此,如果您拥有一个char
来保存一个字符并添加或减去某个值,那么结果将是另一个恰好是不同字符的代码。
在ASCII中,字符0
- 9
,a
- z
和A
- Z
具有相邻的代码点,因此通过添加例如2到A
,结果为C
。
我们可以打印出char后面的数字吗?
当然。这取决于您是否解释 char
中的值只是一个数字或一个字符的代码。例如。与printf
:
printf("%c\n", 'A'); // prints the character
printf("%hhu\n", (unsigned char)'A'); // prints the number of the code
只需要(unsigned char)
转换为char
,因为ptrace
可以是有符号或无符号的,我们希望在此处将其视为无符号。
答案 2 :(得分:3)
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
。
答案 3 :(得分:2)
每个变量都以二进制形式存储(即数字,char
s,只是特定大小的数字。
当使用某些字符编码进行编码时,它们代表一个字符,ASCII标准(www.asciitable.com)就在这里。
与@Igor comment一样,如果您运行以下代码;您会看到char
的ASCII字符,十进制和十六进制表示。
char c = 'A';
printf("%c %d 0x%x", c, c, c);
输出:
65 0x41
为了更好地理解它,你可以制作一个程序来自己生成ASCII表。
答案 4 :(得分:1)
我的计算机科学老师告诉我们要声明的数据类型取决于所需变量值的大小。
这是对的。不同类型可以表示不同的值范围。作为参考,以下是各种积分类型以及它们必须能够表示的最小范围:
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 ,这是编码的范围基本执行字符集(大写和小写拉丁字母,小数位数0
到9
,以及常见的标点字符)。它可以用于存储和对小整数值进行常规算术,但这不是典型的用例。
您可以将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
...
SOH
和EOT
之类的控制字符没有关联的打印字符,因此对于这些值,上面的代码只打印出'.'
。
根据定义,char
对象占用一个存储单元(字节);单个存储单元中的位数必须至少 8,但可能更多。
<小时/>
char
可以是有符号或无符号,具体取决于实现,因此它可以表示该范围之外的其他值,但它必须能够表示*至少*这些值。