10.6.2 符号扩展

只要将有符号的int或short int转换成更多字节的整型,在执行转换的过程中符号位就会扩展至左侧。这就保证值为-5的short int转换成long int之后,它的值仍保持为-5。可以想到,将unsigned的整数转换为更多字节的整数类型时,不会发生符号扩展。

在一些计算机上(如在当前Mac系列使用的英特尔处理器上,以及在iPhone和iTouch当前使用的ARM处理器上),字符是作为有符号的量处理的。这就意味着将字符转换为整数时,会发生符号扩展。只要字符都按照标准ASCII字符集定义,就不会产生问题。但是,如果使用的字符值不是标准字符集的一部分,将其转换为整型时,它的符号就可能会扩展。例如,在Mac机上,字符常量‘\377’会被转换为值-1,这是因为作为有符号的8-bit数时,它的值是负的。

回忆一下,Objective-C语言中允许将字符变量声明为unsigned,这就避免了这个潜在的问题。也就是,将unsigned char变量转换为整型时,永远不进行符号扩展,因为它在数值上总是大于或等于0。对于典型的8-bit字符,有符号字符变量的取值范围是-128至+127,包括这两个数。无符号字符变量的取值范围是0至255,包括这两个数。

如果要强制对字符变量进行符号扩展,则可将这些变量声明为signed char型。这保证将字符变量转换为整型时发生符号扩展,即使在默认情况下不这样做的计算机上也适用。

在第15章“数字、字符串和集合”中,你将学习处理多字节Unicode字符。这是处理一些字符串的首选方式,这些字符串中的字符可以来自包含数百万字符的字符集。