将字符类型转换为整数类型是否安全

时间:2014-09-12 14:52:15

标签: c

int main() {
    char ch = 'a';
    int x;
    x = ch; 
    printf("x=%c", x);
}

这段代码是否安全使用(考虑到机器的耐用性)?

5 个答案:

答案 0 :(得分:3)

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

在这个答案和其他答案中,endian-ness不是一个因素。

这里有4次转换,没有转换:

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

    'a'
    
  2. int转换为char

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

    int
  4. int x; x = ch; 使用传递给它的printf("%c", x)值,将其转换为int x,然后打印该字符。 (C11dr§7.21.6.18 @haccks)注意由于unsigned char已准备就绪x,因此通常会转换可变参数,因此x没有转换。

    int

  5. ** printf("x=%c", x); char的大小相同,int无符号且正范围超过char。这是将int投射到char的一个潜在问题,尽管通常不会丢失数据。如果int的范围为0到2³²-1和char,范围为 - (2³¹-1)到+(2³¹-1),则可能会更复杂。我知道没有这样的机器。

答案 1 :(得分:1)

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

标准库的*getc(fgetc,getchar,...)函数可以做到这一点 - 他们在内部阅读unsigned chars并将其转换为int,因为int提供了额外的功能编码EOF的空间(文件结束,通常是EOF == - 1)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

请参阅C++ variadic arguments

答案 4 :(得分:0)

你在做什么是第一次=

int x = ch =>将char的ascii值分配给int

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