【问题标题】:Is it safe to cast a character type to an integer type将字符类型转换为整数类型是否安全
【发布时间】:2014-09-12 14:52:14
【问题描述】:
int main() {
    char ch = 'a';
    int x;
    x = ch; 
    printf("x=%c", x);
}

这段代码使用安全吗(考虑机器的终结性)?

【问题讨论】:

  • 考虑到 int 通常比 char 大,我会说是的。
  • 注意char “整数类型”。
  • 我的实际程序正在做类似的事情: int getchoice(.........)//请忽略参数 type int main() { ---------- - ------------ printf("u hv selected:%c",getchoice); ----------- } int getchoice(------) { int slected; ---------- --------- slected=getchar(); ------ ------ 返回选中; }
  • 字符文字在 C 中总是 int 类型,所以你的演员是多余的
  • 得到答案后不要编辑您的问题。

标签: c


【解决方案1】:

是的,将字符(如char)类型转换为整数类型(如int)是安全的。

在这个答案和其他答案中,字节序不是一个因素。

这里进行了 4 次转换,没有强制转换:

  1. a 是 C 编码的字符。 'a' 在编译时转换为 int

    'a'
    
  2. int 被转换为char

    char ch = 'a';
    
  3. char ch 被转换为int x。在理论上可能会丢失从charint ** 的数据,但考虑到压倒性的实现,没有。典型示例:如果 char 在 -128 到 127 范围内签名,则它很好地映射到 int。如果 char 在 0 到 255 的范围内是无符号的,这也可以很好地映射到 int

    int x;
    x = ch; 
    
  4. printf("%c", x) 使用传递给它的int x 值,将其转换为unsigned char,然后打印该字符。 (C11dr §7.21.6.1 8 @hacks)请注意,x 没有转换,因为 x 已准备好成为 int 的可变参数的通常转换。

    printf("x=%c", x);
    

** charint 的大小可能相同,而 char 是无符号的,其正数范围大于 int。这是将char 转换为int 的一个潜在问题,尽管通常不会丢失数据。如果char 的范围为 0 到 2³²-1,int 的范围为 -(2³¹-1) 到 +(2³¹-1),这可能会更加复杂。我知道没有这样的机器。

【讨论】:

  • 不保证chunsigned char
  • INT_MAX < CHAR_MAX 很奇怪(在托管实现上)。我可以在这个平台上打印带有printf%cchar 吗? %c 期望 int... 虽然在某些机器上可能有理由让 intchar 具有相同的大小,但我看不出为什么 char 应该在那里未签名。
  • @mafso 我对INT_MAX < CHAR_MAX 的担忧源于stackoverflow.com/a/25776962/2410359 的帖子,同意这样的机器会很深奥。
  • 感谢您的链接;我认为sizeof(int) == sizeof(char) 暗示char 被签名(在托管实现上)来自这里:stackoverflow.com/questions/3860943/…,考虑到printf("%c"),另外还有fputc/fgetc
  • C11 6.2.6.2 p2 “这些[符号和幅度,二进制补码,二进制补码] 中的哪一个适用是实现定义的,符号位为 1 且所有值位为零的值(对于前两个),[...],是陷阱表示或正常值。”不过不知道是否存在。
【解决方案2】:

是的,将整数类型转换为更大的整数类型总是安全的。

标准库的*getc (fgetc, getchar, ...) 函数就是这样做的——它们在内部读取unsigned chars 并将它们转换为int,因为int 为编码EOF(文件结尾)提供了额外的空间, 通常 EOF==-1)。

【讨论】:

  • 谢谢。但是语句 ch2=x; 中发生了什么ch2 将存储最低有效字节或最高有效字节。 ch2 为 0 或 'a'
【解决方案3】:

是的,因为intchar 大,但是出于同样的原因,使用char 代替int 也不安全。

【讨论】:

  • 注意:C 没有指定int 大于charCHAR_MAX 可能大于 INT_MAX。考虑intchar 是否大小相同且char 是无符号的。
【解决方案4】:

首先你要做的是=

int x = ch => 将 char 的 ascii 值赋给 int

最后: printf("x=%c", x); => 将 ascii 值打印为 char,这将打印与该值对应的实际 char。所以是的,这样做是安全的,这是一种完全可预测的行为。
但是安全并不意味着有用,因为整数比字符大,通常我们会做相反的事情来节省一些内存。

【讨论】:

  • ASCII是字符集和编码是高度怀疑的;更有可能是 Windows-1252 或类似版本、IBM437 或 UTF-8。
【解决方案5】:

这里是安全的,因为char 在调用printf 时无论如何都会转换为int

C++ variadic arguments

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多