分类：电脑/网络-程序设计-C/C++
问题：这句话怎么理解？长度相同的有符号与无符号整型数间，远洋赋值，但数 
长度相同的有符号与无符号整型数间，远洋赋值，但数值有时会有变化。比如：void main()      ﹛int b=-1      unsign a      printf("%d->%u\n",b,a)     ﹜结果是-1-〉65535
回答：出现这种情况很正常. 在C语言中任何一种类型的变量都可以转换成另外一种类型的变量, 可以强制转换, 也可以由系统隐含转换.在C语言中, 整数的最高位是作为符号位使用,表示数的正负的, 而无符号整数的最高位是作为数据位来使用的. 例如: 对于16位变量来说, 整型变量最高位是符号位, 表示数的范围为: -32368<=变量<=32367; 有符号整形变量最高位作数据位使用, 表示数的范围为: 0 <=变量<=65535;在这个程序中, 关键的地方在a=b; 系统实际执行的是:a=(unsigned)b; 系统的执行过程是: 首先建立一个临时变量, 执行(unsigned)b操作, 即把b转化成无符号数再赋给这个临时变量. 也就是说最高位不再作为符号使用, 而作为数据位使用. 对于本例来说,就是把机器数: 11111111 11111111 (-1在16位整形变量的机器数)的最高位作数据使用.结果就成了十进制数65535;系统再把这个临时变量(65535)的值赋给a. 所以就输出了这种结果.为什么系统会执行a=(unsigned)b? 这是由于amei_009编程的原因了.当编译程序编译到a=b;时由于a与b不同类型,编程程序会给出Warning类的错误信息, 但是编译一样可以通过(而且编译的程序在编译时就已经按a=(unsigned)b;编译). 只是如果者不修改这种错误重新编译的话. 就会出现上面的结果.