C语言整形数据之间的转换的几个小note

本文详细阐述了无符号数与有符号数之间的转换原则,包括互相转换的方法、转换过程中可能出现的问题及解决策略。同时,强调了在进行逻辑运算时应注意的陷阱,并通过实例解释了转换对数值的影响。

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

1. 无符号数就是普通的二进制表示,有符号数为补码表示,绝大多数的计算机都是用补码表示有符号数
2. 有符号数和无符号数之间互相转换的原则是:两种数字一起运算时,有符号数向无符号数转换,其二进制表示的位模式不会改变。有几个小问题要注意,
1)如果转换的无符号数过大,导致超出补码能够表示的范围,这个就需要琢磨下,转换后的数字到底是多少了。所以,如果无符号数比较小,转成有符号数时其数值可能不会变,而较大时候,则可能数值就变了。
2)无符号数和有符号数之间的逻辑运算,比如>, <这样的运算,其结果就很不直观,容易犯错。举例,32位采用补码的机器,考虑比较式:-1 < 0U, 因为-1的位模式是0xFFFFFFFF,转换为无符号数是个很大的数字,所以,此表达式相当于 4294967295U < 0U,所以表达式为false.
3. 常量整数,默认是有符号的
4. 将一个较小类型的数据类型转为较大的类型时,如果是无符号数,我们只需要在开头简单的添加0, 称为零扩展。而将一个补码数字转为更大数据类型时候则需要做符号扩展,规则是在表示中,添加最高有效位的副本,即,如果最高有效位是0则添加0,是1则添加1

例题:

C语言整形数据之间的转换的几个小note - PiNo - PINO`s blow G
我的理解:0U - 1, 相当于 0U + (-1),一个有符号数,一个无符号数,有符号转为无符号,所以,结果是0xFFFFFFFF,是32位无符号数的最大值,i <= length -1 就相当于 i < 4294967295U, 是必然成立的,用这个i做索引去引用数组,很快就要超出数组的边界,引用到不该用的内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值