• 2007-11-20日学习笔记 - [学习]

    2007-11-20

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://chaoyueziwo21.blogbus.com/logs/10885078.html

    1

    在对有符号数和无符号数之间的转换时,不改变位的表示,只改变该二进制串的值

    比如signed int x = -1

        unsigned int y = (unsigned int)x;

    这里的y将得到整形数中最大的数

      

    2

    C语言中,当一个有符号数和一个无符号数进行操作的时候,有符号数被转换成无符号数再进行操作。

    -1<0U 这个表达式会先将-1变成最大的整数在比较,因此得到的结果是2^32-1<0,结果与想要的相差甚远。

      

    3,当从一个更短的数据类型转换成更长的数据类型时,符号位自动扩展

    short sx = val; /* -12345 */unsigned short usx = sx; /* 53191 */int x = sx; /* -12345 */unsigned ux = usx; /* 53191 *    int x = 53191;short sx = (short) x; /* -12345 */int y = sx; /* -12345 */先将整形数取最低16然后扩展的时候以最高位填充高16位,得到结果和x不一致  

    4

    下面的函数在length0的时候为出现内存错误,解释为什么。从有符号数和无符号数的角度出发。避免出现这种错误的方法就是尽量不要用无符号数

    1 /* WARNING: This is buggy code */2 float sum_elements(float a[], unsigned length)3 {4 int i;5 float result = 0;67 for (i = 0; i <= length-1; i++)8 result += a[i];9 return result;10 } 

    历史上的今天:

    GDB使用 2007-11-20

    收藏到:Del.icio.us