你可以调试程序;比如加入语句printf(“n=%d,m=%d”,n,m);在输入n,m后面,是有结果的
再加printf(“u=%d,v=%d”,u,v);在输入u,v后面,也是有结果的
证明%d没有错误%x对应的是int类型
所以 用%x默认会把参数转为int
而-2转为int, 值不变, 16进制值为0xfffffffe
unsigned short 赋值为-2的时候, 会根据-2的补码,转为对应的无符号值,也就是65534
用%x输出时,还是转为int 值还是65534, 所以会输出fffe
参考资料:
C 标准及POSIX 指定 sprintf 及其变体的行为在参数与目标缓冲区重叠时未定义。示例:
sprintf(dst, "%s and %s", dst, t); // <- 有错:未定义行为
输出无符号应该用: %u 或 %lu 或 %Lu (对应int、long, long long)输出16进制用: %x 或 %lx 或 %Lx (对应int、long, long long)
%h似乎没有定义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)