P4基础数据类型及操作 以及 数据类型转换
P4基础数据类型及操作 以及 数据类型转换
本来来自
http://www.sdnlab.com/17882.html
一、基础数据类型及操作
P4语言中定义了5种基础数据类型,分别是:bool、bit、int(W)、varbit、int。
此处W代表长度,通常使用十进制数字表示,如bit
通常情况下,不同的数据类型之间可以相互转换,并且所有的二目运算符都要求数据类型保持一致,除了位移操作符(shifts)
(1)布尔型(bool)
布尔型,值为true或false,非整数型。布尔类型数据可以进行如下运算
| 运算符 | 描述 |
|---|---|
| and | 二目,操作数必须都为布尔型,运算结果布尔型 |
| or | 二目,操作数必须都为布尔型,运算结果布尔型 |
| not | 单目, 操作数必须为布尔型,运算结果为布尔型。 |
| ==,!= | 测试是否相等或者不等,运算结果为布尔型 |
(2)无符号整型(bit)
无符号整形(unsigned integers)也叫位串(bit-string)。位串是以比特位形式表示的任意长度的数。位串以比特位形式表示的任意长度的数(如:bit<128>,表示长度位127比特的位串),但如果需要对位串进行某些数学运算,位串长度必须是8的整数倍。
支持以下运算。
| 运算符 | 描述 |
|---|---|
| ==,!= | 测试是否相等或不等,运算结果为布尔型 |
| <,>,<=,>= | 无符号数比较,操作数的长度(W)要求相同,运算结果位布尔型 |
| &,|,^ | 按位运算符, 操作数的长度(W)要求相同,运算结果为无符号整型。 |
| ~ | 运算结果位操作数的补码 |
| <<,>> | 左移运算符操作数为无符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移 |
| + | 单目,效果等于没有no_op |
| - | 单目,计算结果位2W减去操作数,W为操作数长度 |
| + | 双目,操作数长度要求一样。计算结果位操作数的算数和,且运算结果必须为W,超过截断 |
| - | 双目,操作数的长度(W)要求相同。计算结果为操作数的算术差。 |
| * | 无符号乘法运算,操作数的长度(W)要求相同,计算结果为无符号数且长度与操作数相等。 |
(3)有符号整形(int(W))
| 运算符 | 描述 |
|---|---|
| ==,!= | 测试是否相等或不等,运算结果为布尔型。 |
| <,>,<=,>= | 有符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。 |
| &,|,^ | 按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。 |
| ~ | 运算结果为操作数的补码。 |
| <<,>> | 左移运算符操作数为有符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。 |
| +(单目) | 单目加运算,效果同no-op。 |
| -(单目) | 单目减运算,运算结果有符号整型,且长度与操作数相等。 |
| +(双目) | 二目加运算,操作数数据类型必须相同,运算结果也为同类型。 |
| -(双目) | 二目减运算,操作数数据类型必须相同,运算结果也为同类型。 |
| * | 有符号乘法运算,操作数的长度(W)要求相同,计算结果为有符号数且长度与操作数相等。 |
(4)变长位串(varbit)
变长位串(dynamically-sized bit-strings)不支持算术、比较、按位运算,甚至不支持类型转换。该数据类型在定义时会指定一个静态的最大宽度值,解析器会提取变长位串数据并设置一个值作为长度。
(5)无线精度整形(int (W) )
| 运算符 | 描述 |
|---|---|
| ==,!= | 测试是否相等或不等,运算结果为布尔型。 |
| <,>,<=,>= | 有符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。 |
| &,|,^ | 按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。 |
| ~ | 运算结果为操作数的补码。 |
| <<,>> | 左移运算符操作数为有符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。 |
| +(单目) | 单目加运算,效果同no-op。 |
| -(单目) | 单目减运算,运算结果有符号整型,且长度与操作数相等。 |
| +(双目) | 二目加运算,操作数数据类型必须相同,运算结果也为同类型。 |
| -(双目) | 二目减运算,操作数数据类型必须相同,运算结果也为同类型。 |
| * | 有符号乘法运算,操作数的长度(W)要求相同,计算结果为有符号数且长度与操作数相等。 |
| /,% | 二目有符号除法和取模运算,操作数必须是正整数,运算结果为正整数。 |
二、数据类型转换
在P4中,对数据进行运算时大多时候都要保证操作数数据类型的一致性,P4也提供了基础的数据类型转换功能
| From | to | 描述 |
|---|---|---|
| bit<1> | bool | 0代表false,1代表ture |
| bool | bit<1> | false代表0,true代表1 |
| bit |
int |
保留所有比特位不变 |
| int |
bit |
保留所有比特位不变 |
| bit |
bit |
当w>w1时,保留低位W1位长度的数据,当w<w1时新增位补0 |
| int |
int |
当w>w1时,保留低位W1长度的数字,当W<W1时新增位补符号位 |
| int | bit |
将整形转化为位串,保留低位w位长度数据,溢出需要发出警告并转化位负数 |
| int | int |
将整型转化为位串,保留地位W位长度数据,溢出需要发出警告。 |
在P4程序中对数据进行运算时,除了用户在编写程序是手动转换数据类型,P4编译器在某些情况下也会自动进行类型转换,这种转换是强制的、自动的隐式类型转换。如下表
bit<8> x;
bit<6> y;
bit<8> z;
| 表达式 | 实际实现 |
|---|---|
| x+1 | x+(bit<8>)1 |
| z<0 | z<(int<8>)0 |
| x<<13 | 0;//溢出时发出警告 |
| x|0xFFF | x|(bit<8>)0xFF;//溢出时发生警告 |
浙公网安备 33010602011771号