当前位置: 首页 > news >正文

C语言类型转换和溢出常见错误

类型转化

C语言进行类型转换时,采用符号扩展还是零扩展,只取决与被扩展数的类型,与目的类型无关

unsigned int a;
long long b;
long long c;
b = (long long) a;
c = (long long)(int) a;

b和c有本质的区别

  • b是由a零扩展得到,高32位为0
  • c是由a符号扩展得到,高32位与a的最高位相同:a首先被解释为带符号数,再进行扩展

常见的误解:认为c = (long long)(int) a(int) a可能发生无符号数到有符号数的溢出,从而导致结果错误。实则不然,intunsigned int只是解释不同,在机器层面上本质一样!

溢出

int a;
long long b;
long long c;
b = a * a;
c = (long long)a * (long long)a;

常见误解:b可以得到a*a的64位完整结果。但事实上,两个 int 类型相乘,结果仍然是 int 类型,只是把 int 结果赋值给 long long 类型的 b,a*a溢出时,b得到错误的值;c得到a*a的64位正确结果

实际的应用

NEMU项目用C语言实现RSIC-V32位虚拟机,其中涉及到以下指令:

  • mulh 有符号32位 × 有符号32位,结果为高 32 位
  • mulhu 无符号32位 × 无符号32位,结果为高 32 位
  • mulhsu 有符号32位 × 无符号32位,结果为高 32 位
    正确的逻辑如下
//src1:源操作数1,src2:源操作数2,R(rd):目的操作数
//mulh
long long tem = (long long)(int)src1 * (long long)(int)src2; 
R(rd) = (int)(tem >> 32);
//mulhu
long long tem = (unsigned long long)src1 * (unsigned long long)src2;
R(rd) = (int)(tem >> 32);
//mulhsu
long long tem = (long long)(int)src1 * (unsigned long long)src2; 
R(rd) = (int)(tem >> 32);
http://www.dtcms.com/a/553715.html

相关文章:

  • 《计算类云服务》
  • CentOS7 搭建DHCP服务器(一台服务器虚拟机+2台客户端虚拟机演示)
  • 【MySQL】mysqldump使用方法
  • Docker化你的Python应用:从开发到生产
  • 做网站需要多少兆空间安徽网站优化好不好
  • 【weblogic】协议反序列化漏洞
  • LeetCode 287. 寻找重复数
  • C#理论学习-WinForm实践开发教程总结
  • 深入浅出 ES Module
  • 深度学习专题:模型训练的数据并行(二)
  • 企业网站建设方案新闻网站购买域名
  • C++ STL 有序关联容器高频面试题解析
  • 腾讯风铃怎么做网站成都哪家做网站
  • 二叉树核心算法分类精讲:选择、遍历与结构关系
  • 【人工智能系列:走近人工智能05】基于 PyTorch 的机器学习开发与部署实战
  • Arbess零基础学习,创建第一条流水线
  • Linux DNS 深度解析与最佳实践
  • RGB转换为NV12,查表式算法
  • PostIn零基础学习,创建第一个项目
  • 百度网站优化排行做响应式网站应该注意什么
  • 女生化妆品网站建设规划书该网站的域名为
  • 基于NvVideoEncoder的H265视频编码器
  • 淄博网站快照优化公司html5开发网站
  • 厦门门户网站制作服务商保健品商城网站模板
  • day61-devops
  • 【代码随想录算法训练营——Day54】并查集——107.寻找存在的路线
  • 用「费曼-神经耦合学习法」21天攻克算法
  • VScode C/C++环境配置
  • 禁用vscode的任务结束提示
  • 做网站接单的网站公司做网站哪个好