2014-09-12 119 views
1
int main() { 
    char ch = 'a'; 
    int x; 
    x = ch; 
    printf("x=%c", x); 
} 

此代码是否安全使用(考虑机器的端点)?将字符类型转换为整数类型是否安全

+2

考虑到int通常比char大,我会说是。 – njzk2 2014-09-12 14:54:23

+4

请注意'char' *是*“一个整数类型”。 – unwind 2014-09-12 14:57:30

+0

我的实际PROGRAMM正在做这样的事情: INT getchoice(.........)// PLZ忽略的参数类型 INT主要(){ ----------- ------------ printf(“u hv selected:%c”,getchoice); ----------- } int getchoice(------) { int slected; ---------- --------- slected = getchar(); ------ ------ return slected; } – 2014-09-12 15:04:16

回答

3

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

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

有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.18 @haccks)请注意,由于x已准备好int,因此通常转换可变参数时不存在x的转换。

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

** charint可以是相同的尺寸和char是无符号的具有正的范围超过int。这是铸造charint的一个潜在问题,但通常不会丢失数据。如果char具有范围0-223 -1和int且范围为 - (2 31-1)至+(23-1-1),则该可能会更复杂。我知道没有这样的机器。

+0

我明白了。谢谢。 – 2014-09-12 17:03:59

+0

不能保证'ch'是一个'unsigned char'。 – haccks 2014-09-12 17:14:02

+0

'INT_MAX mafso 2014-09-12 17:14:52

0

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

+1

注意:C没有指定'int'大于'char'。 'CHAR_MAX'可能大于'INT_MAX'。考虑如果'int'和'char'是相同的大小和'char'是无符号的。 – chux 2014-09-12 15:40:31

0

你在做什么,首先=

int x = ch =>的字符的ASCII值赋值给一个int

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

+0

ASCII是字符集和编码是非常值得怀疑的;更可能是Windows-1252或类似的,IBM437或UTF-8。 – 2014-09-13 00:40:21

1

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

标准库的*getc(龟etc,getchar函数,...)功能做到这一点 - 他们阅读unsigned chars内部和它们转换成int因为int编码EOF(文件结束,提供额外的空间,通常EOF == - 1 )。

+0

谢谢。 但是在声明中发生了什么ch2 = x; ch2将存储最低有效字节或最高有效字节。 ch2是0或'a' – 2014-09-12 15:15:26

相关问题