0203 强制转换
Posted cxllxc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0203 强制转换相关的知识,希望对你有一定的参考价值。
强制转换
1
如果把一个取值范围大的数值赋值给取值范围小的变量,是不允许直接赋值的,如果一定要这么做就要加入强制转换
2
格式
int a = (byte) b;
int a = 300;
byte b = (byte) a;
//这种情况下会出现错误,因为byte的取值范围小于int,会出现无法转换的情况
举例
package com.lxc.arithmeticoperator;
public class ArithmeticoperatorDmol3
public static void main(String[] args)
byte b1 = 23;
byte b2 = 45;
//此处进行强制转换使,后面的计算部分要用括号括起来
byte result = (byte)(b1 + b2);//若b1+b2大于128或者小于-127,超出了byte的取值范围,则会报错
System.out.println(result);
SV强制类型转换和常数
参考技术A静态转换有三种,分别是数据类型强制转换、向量宽度强制转换和符号强制转换,格式分别为:
静态强制转换是编译时的转换,转换的操作总会运行, 而不会检查结果的有效性
下面对数据类型强制转换和向量宽度强制转换做了仿真:
仿真结果如下:
系统函数 $cast 是动态的,并且 在运行时进行带转换数值的检查
动态强制类型转换的格式为: $cast(dest_var, source_var); ,系统函数 $cast 有两个变量:目标变量和源变量
下面几种情况会导致无效的强制类型转换:
$cast可以作为任务调用也可以作为函数调用,作为任务调用时,如果转换不成功, 会报告运行时错误 ,但作为函数调用时, 不会报告运行时错误
系统函数$cast具有返回值,如果转换成功,返回 1 ;转换失败,返回 0
例如:
$cast函数不能和直接修改源表达式的操作符(++, +=)一块用
$cast函数主要用途是将表达式的结果赋给枚举类型变量
静态强制转换是可综合的,动态强制转换由于一些综合工具可能不支持$cast系统函数
系统函数和系统任务都是不可综合的
下面这个例子,将 0.25*8 动态装换成 int 类型,并通过系统函数 $cast 判断转换是否成功
仿真结果如下:
Verilog提供了三种常数类型 parameter 、 specparam 和 localparam
确立 实质上是软件工具建立模块实例代表的设计层次的过程
Verilog限制 parameter 、 specparam 和 localparam 常数的声明只能在模块、静态任务和静态函数中, 不允许在动态任务和动态函数中
关键字const 允许将任何变量声明为常数,const形式的常数直到确立完成后才被赋值
const常数的使用范围:
const常数的声明必须包含数据类型,例如:
const常数实质上是一个只能被初始化的变量
本文摘在《SystemVerilog硬件设计与建模》
以上是关于0203 强制转换的主要内容,如果未能解决你的问题,请参考以下文章