源程序如下:
#include <stdio.h>
void main()
{
unsigned int a= -65535;
printf("%u\n",a);
}
输出结果4294901761,我的疑问是为什么编译器不能直接提出错误或者警告信息,提示不能赋值为有符号的-65535?

解决方案 »

  1.   

    赋值65535是为了检测INT型的长度。
      

  2.   

    其实有符号与没有符号,不是看后面的那个参数,是看前面的那个 u 或是 d 的. unsigned b = 0xffffffff;
    printf("%d",b);
    这样输出的,也不会是 0xffffffff ,而是 -1
    只要前面是 %d ,后面是 signed unsigned 什么都没有关系,long 或其他,他反正是照读 4 个字节去处理,是什么就输出什么.输出时当作signed int
    %u 就当作 unsigned
      

  3.   

    这么讲的话,声明unsigned根本就无关痛痒了?
      

  4.   

    编译器不提供此类warning吧
    unsigned int a = 1;
    a = a-10
    printf("%d\n",a);==>"-9"
      

  5.   

    我也想问一下,对于这些不定参数的函数,到底在函数的里面,有没有办法得知传进来的参数,到底是什么类型的呢?我的试验就是他是无法得知传进去的参数的类型的.
    因为下面的代码输出都会出错
    printf("%f\n",1234);
    printf("%d\n",double(1));
    因为 printf 函数不知道参数的类型,反正 %f 就处理参数栈里的 8 个字节(就算只有4个字节,也照处理8个字节),而 %d 就去栈里找4个字节,就算传了8个字节进来.在8位机里也试过, printf("%d,%d",0x80,0x01); 这个硬件中栈是一个字节一个字节地压,int是16位.
    然后输出时,第一个%d是找栈里的2个字节,把后面的参数与前面的参数加起来一起输出到了第一个 %d 处了
    只有 printf("%d,%d"(int)0x80,int(0x10)); 这样写时,才会正确.
    结论基本就是 printf 函数在内部判断前面 %d %u %f 的标志,从栈中找参数值,而传入去的是什么类型的值,他就不管了,就算后面的参数写少了,也照样从栈里取数,而不管取出来的是对是错.