关于操作数的讨论中,我们详细了解了操作数的不同类型,包括常数、线网、位选、存储器和数组元素、参数、变量、部分位选以及函数调用。
这里,我们主要关注常数这一类型,并通过例子来深入理解其特性和在表达式中的应用。
操作数可以是以下类型中的一种:
(1)常数(3)线网
(5)位选(Bit-select)
(7)存储器和数组元素
(2)参数
(4)变量
(6)部分位选(Part-select)
函数调用
常数:
常数可以是十进制数、基数型整数(二进制、十六进制等)或实型数。十进制数在表达式中通常被解释为有符号数,而基数型整数则被视为无符号数。
这种区分对于理解整数的运算方式至关重要。
当我们写下一个十进制数-12时,它明确表示为一个有符号的负数。
当我们使用基数表示法,如5'b10100,来表示一个整数时,它被视为一个无符号数,其值等于十进制的20。
值得注意的是,负值的处理方式在有无基数表示的情况下是不同的。对于没有基数表示的负整数值,如-44,它被视为有符号数,并按有符号数的规则进行运算。而对于有基数表示的负整数值,如-6'o54(注意这里的负号并不在基数表示法内,仅表示我们要对这个值取负,但值本身是按无符号数处理的),它实际上会被当作一个无符号数来处理,这可能导致与预期不同的运算结果。
在前面的章节中,我们曾对常量做过介绍。
下面举几个例子加以说明
256,7 //位数不确定的十进制数 4'b10 11,8'h0A//位数确定的整型常量 b1 ,'hFBA //位数不确定的整型常量 90.00006 //实型常量 " BOND"/*字符串常量;每个字符作为8位ASCII值存储*/
表达式中的整数值可以被认为是有符号数或无符号数。若表达式中是十进制整数,例如12,则12被解释为有符号数。若整数是基数型整数(位数确定或者不确定),则该整数被当作无符号数。下面举几个例子加以说明
12 是01100的5位向量形式(有符号) -12 是10100的5位向量形式(有符号) 5'b01100 是十进制数12(无符号) 5'b10100 是十进制数20(无符号) 4'd12 是十进制数12(无符号) 8'shDF① 是11011111以8位向量的形式表示(有符号)
更为重要的是这样一个事实,即用基数或不用基数表示的整数,其负值的处理方式是各不相同的。不用基数表示的负整数值被当作有符号数处理,而用基数表示的负整数值被当作无符号数。因此-44和-6'054(十进制的44等于八进制的54)在下例中处理不同。
integer event_reg; ..... event_reg=-44/4 event_reg=-6'054/4;
请注意,表示一44和一6'054的二进制位序列是相同的;但是-44作为有符号数处理,而-6'o54作为无符号数处理。因此第一个字符中event_reg的值为一11,而在第二个赋值中event_reg 的值为 1073741813②.
总结:
在操作数的讨论中,常数作为一种重要的类型,其特性和在表达式中的应用值得我们深入探讨。常数可以是十进制数、基数型整数(如二进制、十六进制)或实型数。十进制数在表达式中通常被解释为有符号数,而基数型整数则被视为无符号数。
负值的处理方式在有无基数表示的情况下是不同的。没有基数表示的负整数值被视为有符号数,而有基数表示的负整数值则可能引发误解,因为在实际运算中,它们会被当作无符号数处理,这可能导致运算结果与预期不符。
在赋值event_reg=-44/4中,-44作为有符号数处理,event_reg的值会被计算为-11。然而,在赋值event_reg=-6'o54/4中,由于6'o54被视为无符号数,其值等于十进制的44,然后取其负值并进行二进制补码转换,这可能导致event_reg的值变得非常大,如1073741813(具体值取决于整数类型和位宽)。