源程序如下:
#include <stdio.h>
void main()
{
unsigned int a= -65535;
printf("%u\n",a);
}
输出结果4294901761,我的疑问是为什么编译器不能直接提出错误或者警告信息,提示不能赋值为有符号的-65535?
#include <stdio.h>
void main()
{
unsigned int a= -65535;
printf("%u\n",a);
}
输出结果4294901761,我的疑问是为什么编译器不能直接提出错误或者警告信息,提示不能赋值为有符号的-65535?
printf("%d",b);
这样输出的,也不会是 0xffffffff ,而是 -1
只要前面是 %d ,后面是 signed unsigned 什么都没有关系,long 或其他,他反正是照读 4 个字节去处理,是什么就输出什么.输出时当作signed int
%u 就当作 unsigned
unsigned int a = 1;
a = a-10
printf("%d\n",a);==>"-9"
因为下面的代码输出都会出错
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 的标志,从栈中找参数值,而传入去的是什么类型的值,他就不管了,就算后面的参数写少了,也照样从栈里取数,而不管取出来的是对是错.