int main() {
char ch = 'a';
int x;
x = ch;
printf("x=%c", x);
}
这段代码是否安全使用(考虑到机器的耐用性)?
答案 0 :(得分:3)
是的,将字符(如char
)类型转换为整数类型(如int
)是安全的。
在这个答案和其他答案中,endian-ness不是一个因素。
这里有4次转换,没有转换:
a
是C编码的字符。 'a'
在编译时转换为int
。
'a'
int
转换为char
。
char ch = 'a';
char ch
转换为int x
。在理论中,可能会有从char
到int
**的数据丢失,但鉴于压倒性的实现,没有。典型示例:如果{-1}}在-128到127范围内签名,则会很好地映射到char
。如果int
在0到255范围内无符号,那么这也会很好地映射到char
。
int
int x;
x = ch;
使用传递给它的printf("%c", x)
值,将其转换为int x
,然后打印该字符。 (C11dr§7.21.6.18 @haccks)注意由于unsigned char
已准备就绪x
,因此通常会转换可变参数,因此x
没有转换。
int
** 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
。
答案 4 :(得分:0)
你在做什么是第一次=
int x = ch
=>将char的ascii值分配给int
最后:
printf("x=%c", x);
=>将ascii值打印为char,它将打印与该值对应的实际char。所以,这样做是安全的,这是一个完全可以预测的行为
但是安全并不意味着有用,因为整数大于char,通常我们会反过来节省一些内存。