(C语言)signed和unsigned类型转化

本文介绍了C语言中signed和unsigned数据类型的差异,包括它们如何影响数值解析、二进制表示、高位补足以及在类型转换时可能出现的问题。讨论了在使用printf输出时的注意事项,以及如何通过显式转换避免潜在的错误。最后提供了一个综合性的代码示例,展示了在不同环境和编译器下可能出现的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

于long, int, short, char等数据类型,我们可以通过signed和unsigned修饰来确定其能存储的数据范围。其中signed中保存的数据是可正可负,而unsigned的数据范围是0-对应数据类型的上限。

平时我们声明:int a的时候,默认a是一个signed类型的,也就是a可能是正值也可以是负值。

而在使用诸如printf函数的输出的时候,也需要注意输出的控制字符,即便声明的时候为:unsigned int a, 但是如果用printf("%d", a);进行输出,那么C语言在编译的时候会有一个隐性的转换,从而等同于:printf("%d", (signed)a);的结果。所以要输出一个unsigned int的值,需要使用printf("%u", a);的方式。

实际上无论是signed还是unsigned的方式,对于数据的二进制本身都是没有任何影响的,只是处理不同而已。比如:一个数据如果在内存中的二进制编码为:1001 0101,那么当使用signed进行解析的时候,高位的1,即:【1】001 0101,被看成了符号位。而当使用unsigned进行解析的时候高位的1和其他位上的1没有任何区别,都是用于存储数据的。在使用补码存储负数的情况下:

signed 1001 0101 = -107;

unsigned 1001 0101 = 149。

另外一个signed与unsigned在补足高位的时候也有一个显著的区别:

1、如果是一个signed的数据类型,那么在高位会按照符号位来进行补足,比如:1001 0101如果保存在两个字节中,那么结果是:1111 1111 1001 0101;

2、如果是一个unsigned的数据类型,那么在高位将直接补0,比如:1001 0101如果保留在两个字节中,那么结果是:0000 0000 1001 0101。

不同的补足方式,如果在后续的操作中将signed和unsigned进行转化,显示的结果也许会和你预想的大相径庭。

最后再补充一点,在数据进行signed和unsigned的转换时,默认是转化为int类型,而非你定义的类型,如:

short s = 10;

printf("%u", (unsigned) s); //这句话等价与:printf(&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值