-
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,
下面的函数在length为0的时候为出现内存错误,解释为什么。从有符号数和无符号数的角度出发。避免出现这种错误的方法就是尽量不要用无符号数
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 }
收藏到:Del.icio.us
| 首 页 | LINUX更改网络配置 >>
评论