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 强制转换的主要内容,如果未能解决你的问题,请参考以下文章

我们如何强制 ForEach 使用 UUID 而不是 (id: \.self)?

SV强制类型转换和常数

c语言强制转换的疑问

Java中的强制类型转换是如何转换的?

Java中的强制类型转换是如何转换的?

Python中的强制转换和强制转换有啥区别?