有符号数和无符号数之间的转换

补码与无符号数

补码转换为无符号数原理:

在这里插入图片描述
例如:
T 2 U w ( − 12345 ) = − 123456 + 2 16 = 53191 T2U_{w}(-12345) = -123456+2^{16}=53191 T2Uw(12345)=123456+216=53191

无符号数转化为补码原理:
在这里插入图片描述

截断数字

无符号数截断
在这里插入图片描述

有符号数截断
在这里插入图片描述
假如将一个4位数值截断到一个3位数值,表示无符号形式的9和补码形式的-7

无 符 号 形 式 的 9 : k = 3 , 2 3 = 8 , 故 9 的 截 断 数 值 为 1 无符号形式的9: k=3,2^{3}=8, 故9的截断数值为1 9k=3,23=8,91
补 码 形 式 的 − 1 : B 2 U 3 ( − 1 ) = 9 , B 2 U 3 ( − 1 ) m o d 2 3 = 1 , 故 B 2 T 3 ( − 1 ) = 1 , 补码形式的-1:B2U_{3}(-1)=9,B2U_{3}(-1)mod2^{3}=1,故B2T_{3}(-1)=1, 1B2U3(1)=9,B2U3(1)mod23=1,B2T3(1)=1,

有符号数隐式强制类型转换到无符号数

试图计算数组a中所有元素的和,代码如下:

#include<stdio.h>

float sum_elements( float a[], unsigned length ){

        int i =0;
        float result = 0;

        for( i = 0; i <= length-1; i ++)
                result += a[i];
        return result;

}
int main(){

        float a[] ={0,1,2,3,4,5,6};

        sum_elements(a,0);

        return 0;
}               
运行结果如下:

在这里插入图片描述

预期应该出现0.0,但是出现了内存错误。
因为length是unsigned类型,当 0 - 1 =UMax,而<=同样是unsigned类型比较,任何数只能小于或等于UMax,因此会发生数组越界。
将 unsigned改为int 或者 i < length 将达到预期目标。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值