【问题标题】:Printing type-cast types in C在 C 中打印 type-cast 类型
【发布时间】:2019-07-21 18:37:44
【问题描述】:
#include <stdio.h>

int main(void) {
  int nr = 5;
  char castChar = (char)nr;
  char realChar = '5';
  printf("The value is: %d\n", castChar);
}

如果上面的代码被编译,输出将是:

The value is: 5

但是如果编译下面的代码,控制台将输出值 53 代替。为什么它的打印与打印“castChar”时的打印不同?

#include <stdio.h>

int main(void) {
  int nr = 5;
  char castChar = (char)nr;
  char realChar = '5';
  printf("The value is: %d\n", realChar);
}

【问题讨论】:

  • 因为字符串 '5' 的 ASCII 值是 53。如果要将其打印为字符串,请使用 %c
  • 我知道 ASCII 是什么以及 printf 是如何工作的。再看一下代码,castChar 是一个类型转换的char。它打印出 5,这是从 ASCII 转换而来的值。 realChar 被初始化为一个字符,而不是类型转换为 castChar。两者都是字符,但它们打印出不同的值。
  • (char)5'5' 的意思完全不同。
  • @OldProgrammer '5' 不是字符串,而是字符。字符串来自" " C 中的双引号。stackoverflow.com/a/3683613/7508077

标签: c types printf typecasting-operator


【解决方案1】:

(char)5'5' 不是一回事。

文字'5' 是一个整数值,表示字符5。它的值取决于平台。假设字符的 ASCII 表示,这将是 53。

文字 (char)5 是整数值 5,已被强制转换为类型 char。这意味着它在强制转换后保留 5 的值。

【讨论】:

  • 如果类型转换的行为不像被转换的类型,那么它的意义何在?
  • 通常应该避免强制转换。几乎总有一种方法可以将使用类型转换的代码编写成不使用它的更简洁的代码。 C 中的类型转换将用于将类型重新解释为不同的类型,例如将有符号整数解释为无符号整数。
  • 严格的别名要求一个对象只能被它自己的类型或char解释。因此,您有时会看到对象指针被视为char *,有时这将通过强制转换来完成。
  • @MoonOnAStick:它确实表现得像被转换的类型 - 如有必要,被转换的值将被转换为不同的表示形式。但是,它不会改变 value。同样,整数值5 和字符值'5' 不一样,简单的转换不会将一个转换为另一个。
  • 另一种需要强制转换的情况是确保将指针传递给期望看到 NULL 指针的变量参数函数。由于NULL 可能被定义为裸0,因此它将作为int 传递而无需强制转换。
【解决方案2】:

因为castChar的值是整数值5,而realChar的值是字符值的整数编码'5'(ASCII 53)。这些不是相同的值。

铸造与它无关。或者,更准确地说,将nr 转换为char 不会给您字符值 '5',它只是将整数值5 分配给更窄的类型。

如果您希望输出 5,那么您需要使用 %c 说明符而不是 %d 说明符来打印 realChar

【讨论】:

  • 我听说在 C 中我们可以使用其他字符集而不是 ASCII,char realChar = '5'; 中的 realChar 是否有可能与 53 不同?
  • 这是否意味着铸造整数的最大值与非铸造整数不同?
  • @EsmaeelE:C 将其留给底层平台 - 只要支持基本字符集并且十进制数字的编码是连续的,它并不真正关心底层表示是 ASCII 还是EBCDIC 之类的。
  • @MoonOnAStick:不太清楚你的意思。如果您尝试将整数值转换为太小而无法容纳它的 signed 整数类型(例如,signed char x = (signed char) 12345;),您将获得实现定义的结果(或陷阱)。如果您尝试将整数值转换为太小的 unsigned 类型,您将获得模数。
  • @EsmaeelE:十进制等效值 245,但是是的,它将是与 '5' 的 ASCII 码不同的值。
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 2023-03-26
  • 2010-11-13
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多