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)在存储上面是有各自规则的,单纯取出这些字节而不关心它的存储形式是不准确的。 你可以用强制类型转换来得到正确答案,不过这种情况不适用有符号和无符号的转换。
推荐阅读
- 『活动』让孩子们欢欢喜喜过新年 这个元旦好有爱!南京聋校举办多种形式庆祝活动
- 为啥ETC要与车主身份证和车牌绑定,而不能使用类似公交一卡通的形式
- motor1|将提供两种驱动形式 奥迪Q4 e-tron Sportback谍照曝光
- 汽车知识|形式大于内容,长安CS75百万版上市,中期改款主要是换壳
- 网伽是啥现在国内的网吧应该通过啥样的形式向网伽转型
- 变形“超极本”电脑的屏幕的理想形式是啥
- 张云龙|确实烂透了
- Go语言中为啥要保留goto?
- 为啥电台/广播这种近乎要被淘汰的传媒形式,又重新流行了起来
- 怎样在C语言中处理显式(有理)多项式表达式
