C陷阱与缺陷 第7章 可移植性缺陷 7.4 字符是有符号数还是无符号数

发布于:2022-12-25 ⋅ 阅读:(460) ⋅ 点赞:(0)

      字符是有符号整数还是无符号整数
    只有在我们需要把一个字符值转换为一个较大的整数时,这个问题才变得重要起来而在其他情况下,结果都是已定义的:多余的位将被简单地“丢弃”。编译器在转换char类型到int类型时,需要作出选择:应该将字符作为有符号类型处理,还是应该将字符作为无符号数处理?
    有符号整数还是无符号整数影响到程序员对哈希表或转换表等的设计方式。

    常见的错误认识是:如果c是一个字符常量,使用(unsigned)c就可得到与c等价的无符号整数。这是会失败的,因为将字符c转换为无符号整数时,c将首先被转换为int型整数,而此时可能得到非期望的结果。
    正确的方式是使用语句(unsigned char)c,因为一个unsigned char类型的字符在转换为无符号整数是无须首先转换为int型整数,而是直接进行转换。 

    /*
    ** signed char和unsigned char。 
    */
    #include <stdio.h>
    #include <stdlib.h>

    int main( void ){
        char ch = 255; 
        unsigned int ui = (unsigned char)ch;
        unsigned int ui2 = (unsigned)ch;
    
        printf( "ch = %c, ch = %d\n", ch, ch );
        printf( "(unsigned char)ch = %c, (unsigned char)ch = %d\n", (unsigned char)ch, (unsigned char)ch );
        printf( "ui = %d, ui = %u\n", ui, ui ); 
        printf( "(unsigned)ch = %c, (unsigned)ch = %d\n", (unsigned)ch, (unsigned)ch );
        printf( "ui2 = %d, ui2 = %u\n", ui2, ui2 ); 
    
        return EXIT_SUCCESS;
    }
输出:


网站公告

今日签到

点亮在社区的每一天
去签到

热门文章