有符号类型强制转换为无符号类型导致的错误、强制类型转换不安全、隐式类型转换注意事项

5 篇文章 0 订阅

项目中的错误案例

代码中使用int32 类型 将值十进制值2147483648(0x8000 0000)赋值给uint64类型,
在int32类型的二进制中,最高位为1,表示为补码。由Int32赋值给uint64类型的过程中,有两个过程:①将int32升级为int64,此时多出来的最高位全部补1,此时变成了0xffffffff80000000;②,将int64转化为uint64,此时十进制值为18446744071562067968。因此该值远大于2147483648

(以下转载自liuchengxu_

同等长度变量之间的类型转换

同样长度的不同类型相互转换时,比方 shortshort 强制转换成 unsigned shortunsigned short。实际在转换过程中,转换后的 unsigned shortunsigned short 与原来的 shortshort 在计算机中的二进制表示形式一样的,改变的只不过是解释他们的方式。

强制类型转换结果保持位值不变,只是改变了解释这些位的方式。

代码测试:

void main()
{
    short a = -4321;
    unsigned short ua = (unsigned short)a;  //  这里进行强制类型转换
    char *b = new char[sizeof(a)*8];
    cout << "sizeof(short):           " << sizeof(short) << endl;
    cout << "sizeof(unsigned short):  " << sizeof(unsigned short) << endl;
    cout << "真值:" << setw(32) << a << " 机器数" << DecimalToBinary(a, b) << endl;
    cout << "真值:" << setw(32) << ua << " 机器数" << DecimalToBinary(ua, b) << endl;
    return;
}

运行结果:
在这里插入图片描述

不同长度变量之间的类型转换

  • 长字长变量向短字长变量的转换

系统把多余的高位字长部分直接截断,低位直接赋值,也是一种保持位值的处理方法。

测试代码:

void main()
{
int x = -4321;
char *bx = new char[sizeof(x)* 8];
short y = x;
char *by = new char[sizeof(y)* 8];
cout << "真值:" << x << setw(20)<< " 机器数: " << DecimalToBinary(x, bx) << endl;
cout << "真值:" << y<< setw(20) << " 机器数: " << DecimalToBinary(y, by) << endl;
return;
}

运行结果
在这里插入图片描述

  • 短字长变量向长字长变量的转换

短字长转向长字长,不仅是相应的位值相等,高位部分还会扩展为原数字的符号位。

测试代码:

void main()
{
short x = -4321;
char *bx = new char[sizeof(x)* 8];
int y = x;
char *by = new char[sizeof(y)* 8];

cout << "真值:" << x << setw(20)<< " 机器数: " << DecimalToBinary(x, bx) << endl;
cout << "真值:" << y<< setw(20) << " 机器数: " << DecimalToBinary(y, by) << endl;
cout << endl;

x = 4321;
y = x;
cout << "真值:" << x << setw(21) << " 机器数: " << DecimalToBinary(x, bx) << endl;
cout << "真值:" << y << setw(21) << " 机器数: " << DecimalToBinary(y, by) << endl;
return;
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值