【问题标题】:C programming: Type char variable Is For Just One Letter Or Number?C 编程:类型 char 变量仅用于一个字母或数字?
【发布时间】:2020-12-02 22:28:09
【问题描述】:

在教科书“The C Programming Language”中,第 9 页有下面一行。

"char 字符--一个字节"

这是否意味着“char”类型变量只能保留一个字母、数字或符号?

我也想了解这个词的准确定义。

我的理解就在这里。这是正确的吗?


字符:任何字母、数字或符号。

字符串:几个字符。


如果错了,我要正确的定义。

感谢社区所有成员每天的支持。

【问题讨论】:

  • 一个char 代表从-128127 的值,当您想到可打印字符(包括数字)时,您通常会想到ASCII Table and Description 仅前7 个字节用于ASCII(您将听到术语 7 位 ASCII)注意: char 在所有实现中都没有签名,所以char 未签名的那些,你有@ 987654327@ 到 255.
  • 字符串是由'\0' 终止的字符序列(nul-character - ASCII 0)这就是对字符串进行操作的函数如何知道在哪里字符串结束(您将在此处使用术语 nul-terminated string

标签: c variables unix syntax


【解决方案1】:

字符集的正式C标准定义(5.2.1):

应定义两组字符及其相关的整理序列:写入源文件的字符集(源字符集)和在执行环境中解释的字符集(执行字符集)。每个集合进一步分为一个基本字符集,其内容由本子条款给出,以及一组零个或多个特定于语言环境的成员(它们不是基本字符集的成员),称为扩展人物。组合集也称为扩展字符集。执行字符集成员的值是实现定义的。

基本字符集指定包含:

  • 拉丁字母的26个大写字母/--/

  • 拉丁字母的26个小写字母/--/

  • 十进制数字/--/

  • 以下29个图形字符

    ! " # % & ' ( ) * + , - . / :
    ; < = > ? [ \ ] ^ _ { | } ~
    
  • 空格字符,以及代表水平制表符、垂直制表符和换页符的控制字符。

  • 在基本执行字符集中,应有 代表警告、退格、回车和换行的控制字符。

源和执行基本的每个成员的表示 字符集应适合一个字节。

然后 6.2.5 说:

声明为char 类型的对象大到足以存储基本执行字符集的任何成员。

字节的正式定义非常相似(3.6):

字节
可寻址的数据存储单元,大到足以容纳执行环境的基本字符集的任何成员

此外,指定char 始终为 1 字节大 (6.5.3.4):

sizeof 运算符产生其操作数的大小(以字节为单位)/--/
当 sizeof 应用于类型为 charunsigned charsigned char,(或其合格版本)结果为 1。

然而,C 标准并没有指定一个字节中的位数,只是它必须是 8 位或更多。

【讨论】:

  • 您的项目符号列表帮助我了解角色是什么。谢谢!虽然我练习过 Bash Shell 脚本,但 C 编程似乎需要更精确的书写。
【解决方案2】:

标准(C11 的 n1570 草案)说:

声明为 char 类型的对象足够大,可以存储基本的任何成员 执行字符集。如果基本执行字符集的成员存储在 char 对象,其值保证为非负数。

由于标准字符集包含所有大小写字母、十进制数字和一些其他字符,它至少需要7位来表示。无论如何,标准要求 char 的大小至少为 8 位:

[The] 实现定义的值的大小(绝对值)应等于或大于所示值,符号相同。
— 不是位域的最小对象的位数(字节) CHAR_BIT 8

一个字符必须是可单独寻址的。出于这个原因,一个 char 被称为一个字节,根据定义sizeof(char) 是 1,无论确切的位数是多少 - 一些旧的大型机使用 12 位或 16 位字符。

unsigned charsigned char 是整数类型,它们使用与char 相同的存储大小。它们是不同的类型,但 3 种类型之间的转换是完美定义的,并且永远不会改变表示。即使是不同的类型,标准也要求:

实现应将 char 定义为具有相同的范围, 表示和行为为有符号字符或无符号字符。

在常见架构上,char 使用 8 位。 0-127 范围内的所有值都代表 ASCII 字符集(注意:这不是标准强制要求的,并且使用了其他表示,例如 EBCDIC)。其他范围(-128 到 -1 或 128-255)中的值称为扩展字符,可以表示 ISO-8859-x(或拉丁)字符集,或多字节字符集中的字节,如 UTF-8或 UCS2(UTF16 的子集,用于 0-FFFF 范围内的 unicode 字符)。 ISO-8859-1 或 Latin1 是一个单字节字符集,表示 à-255 范围内的 Unicode 字符。它曾经是一个事实上的标准,Windows 仍然使用 CP1252(一个接近的变体)作为西欧语言系统

TL/DR:直接回答您的问题:

  • 一个char代表一些符号,至少是基本的执行字符集
  • 字符串按照惯例是一个以空字符结尾的字符数组。表示的符号取决于使用的字符集,对于多字节字符集(如 UTF8),字符和符号之间没有一对一的关系

【讨论】:

  • @AnttiHaapala:我应该在写之前阅读 limits 部分。现已编辑...感谢您的提醒。
【解决方案3】:

“char”占用一个字节的存储空间,可以表示介于 -128 到 +127 之间的值。这通常用于保存单个 ASCII 字符。在 ASCII 编码中,所有可打印的字符都分配了 32(空格)到 126(波浪号,'~')之间的值,其余代码分配了不可打印的字符。

请注意,与 Java char(可以加粗任何 unicode 字符)不同,“c”char 不能表示拉丁字符。

【讨论】:

  • C标准并没有说char的范围是-128+127,虽然这是一个可能
  • @AnttiHaapala @AnttiHaapala char 始终可以保存 -128127 之间的值,unsigned char 可以保存 0255 之间的值,这就是确定性
  • @Lucas 不正确。 char 始终可以保存0127 之间的值。你需要给自己一个 Raspberry PI。
  • @AnttiHaapala 我真的会明白的。 ;) 但在此之前你需要解释一下。
  • @Lucas godbolt.org/z/3ze5WY - char 的范围和它的签名是实现定义的。碰巧英特尔编译器决定它已签名。 ARM 另有决定。 news.ycombinator.com/item?id=18269886
【解决方案4】:

通常char是一个字节大小的变量类型,由于字节由8位组成,char的值范围是0-255或-128-127如果有符号(一位用于符号指示) .

这 255 个选项用于表示一个值,在 char 的情况下,一个符号、字母或数字(或一些特殊字符)。来自 ASCII 编解码器。

例如,如果您想存储一个日文字母或表情符号,这需要 2 个字节(因为您知道的字符数远多于 255 个)。您必须使用支持这种大小的类型 - 对于 unicode,例如 wchar_t

【讨论】:

  • 通常 8 位,通常 0-255 或 -128-127... 但比 dash-o 的答案更好,后者只是忽略了大多数现有的所有消费类计算设备......
  • @AnttiHaapala 正确,通常添加 ;)
猜你喜欢
  • 2012-07-20
  • 2016-02-26
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
相关资源
最近更新 更多