c语言中以无符号形式输出char变量为啥会扩展?

以32位VS环境为例,调用printf将a压栈的时候a会被扩充为4字节。由于char可能是signed也可能是unsigned(取决于编译器设定),如果char是有符号的那扩充之后就变成了0xFFFFFFFF。然后%u是按unsigned int输出,出来的就是4294967295。如果要打出255,那么(1)printf("%hhu",a);使用%hhu,但这是C99新加的格式,如果IDE用的是VS那么是不支持的(C++只兼容C89)(2)printf("%u",(unsigned char)a);先转成无符号的,这样扩充之后是0x000000FF再压栈,就不会有问题了。
■网友
应该是%hhu,你用gcc这种符合c标准的试试。或许vc2015也行,没试过。
■网友
定义一个char a=-1,然后printf("%u",a)输出,为什么得到的值不是255你确定你知道你自己想做什么以及在做什么吗?比如定义一个char a=-1为什么你要定义a?为什么你给a赋值为-1然后printf("%u",a)输出你这里究竟想做什么?为什么得到的值不是255为什么你认为得到的值应该是255?char不是一个字节吗char是一个字节。但这和输出255还是4294967295有什么关系吗?
■网友
其实很简单,题主还可以测试一下用%d输出浮点数,也不会得到正确的答案,毕竟c语言的三种基本数据类型:有符号的整形(负数以补码形式保存),无符号的整形(包括了字符类型)和浮点类型(存储形式参考IEEE 754)在存储上面是有各自规则的,单纯取出这些字节而不关心它的存储形式是不准确的。 你可以用强制类型转换来得到正确答案,不过这种情况不适用有符号和无符号的转换。


    推荐阅读