基本类型赋值转换规则表
Conversion Rules for Elementary Data
可以将基本数据类型的源字段内容赋给其它基本数据类型的目标字段(除了数据类型 D 无法赋给数据类型 T,反之亦然)。ABAP/4 也支持结构化数据和基本数据对象之间或结构不同的数据对象之间的赋值。
对于每一赋值语句(用 MOVE 或赋值运算符),系统都检查源字段和目标字段的数据类型。如果定义了此类组合的类型转换,则将源字段内容转换为目标字段数据类型并将其值赋给目标字段。
总是按处理无小数位的类型 P 的相同方式处理类型 I。所以,下面表格中提到类型 P 时,同样适用于类型 I 字段。
注意:此表仅只适用于赋值时类型的转换(包括实参传递给形参?),如果是比较的逻辑运算,请参考比较转换规则,其他如Write、字段符号都不会按此规则表进行转换:
DATA: a1(8) TYPE n ,
a2(8) TYPE n ,
b(8) TYPE c VALUE '-1.1235'.
"WRITE赋值时,只作内存原样拷贝,不会作任何转换
WRITE b TO a1.
a2 = b."这里会使用赋值转换规则,只将数字转换过去
"字段符号也是一样不会按照赋值转换规则表进行转换
field-SYMBOLS <fs> TYPE n.
ASSIGN b to <fs> CASTING.
WRITE:/ 'write:', a1.
WRITE:/ '= :' , a2.
WRITE:/ '<fs> :' , <fs>.
write: -1.1235
= : 00011235
<fs> : -1.1235
附录C 数据转换规则 |
|
||||||||||||||
|
|||||||||||||||
源类型 |
目标类型 |
转换规则 |
|
||||||||||||
|
C |
|
C |
左对齐将源中的字符传输到目标字段中,如长度不同,则用空格从右边开始进行填充(短于目标时),则在右边将其内容截断(长于目标时)。注:源中的尾部空格不会被传输到目标字段中 |
|
|
|||||||||
|
C |
|
D |
源字段头8个字符传输到目标字段中。为了日期有效,头8个字符应包含格式为YYYYMMDD的8个数字字符日期,但实质每位可以是任意字符,转换时不会出错,并且会原样传输到目标字段中 |
|
|
|||||||||
|
C |
|
F |
源字段内容必须是类型F字段的有效表示。
先将源字段格式化为 <±尾数部分>E±<指数部分(至少占两位)> ,尾数部分为整数只有一位的小数格式,如果尾数部分的小数位大小于16位,第17位会四舍五入截断
如果源全为空格,或者空格后面紧跟着非F类型所包含的合法字符时,则转换结果为0;如是有前导空格,但后面紧跟着的是合法的F格式字符,则还是会正确转换;如果含有的全是F格式合法字符,且中间含有空格时,空格后面所有合法的字符也不再被解析;如果不是以空格开头,且又含有非法字符,则运行时会抛出异常。
DATA: c(30) VALUE '123.012345678901274567', f TYPE f." 1.2301234567890127E+02
注:空格字符为F格式的合法字符,且空格后紧跟着的所有字符都会被忽略不处理,所以空格后面紧跟着的其他非法字符也是没有问题的,比如 ' 1 a'就可以合法转换,但 ' 1a' 运行时就会抛出异常 |
|
|
|||||||||
|
C |
|
N |
将源字段中的所有数字传输到目标字段中,并且是右对齐的方式。 如果目标字段过长,则会使用0来填充左边;如果目标字段过短,则左边多余的会截断 |
|
|
|||||||||
|
C |
|
I、P |
所有能转换的字符组成的结果不能超出I的取值范围(-2147483648~+2147483647),否则会抛出异常。
不能大于目标P所定义的长度,比如下面代码中,p最大只能为 999 ,如果再多一位,则运行时就会抛出异常 DATA: c(3) VALUE '999', p(2) TYPE p .
如果源全为空格,则转换结果为0;如是有前导空格,但后面紧跟着的是合法的I/P格式字符,则还是会正确转换; 与 C→F不同的是,' 1 2' 类似的串运行时会抛异常,也就是说,在源串中,空格只能为前导,而不能出现在中间,即使所有的字符都是I/P格式合法字符。 |
|
|
|||||||||
|
C |
|
T |
源字段应包含格式为HHMMSS的6个数字字符时间。其他规则与 C→D是一样的 |
|
|
|||||||||
|
C |
|
X |
源字段应包含十六进制字符串格式,有效字符为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F(注:字母都是大写,小写是无效的)。该字符串被视为十六进制数,左对齐传送,并且右边用零填充或截断。 转换时,会从左到右来读取源中的所有合法的十六进制字符,如果一旦遇到一个不会合法的十六进制字符时,会立即终止读取,并且从这个非法字符到最后所有字符都会使用0来代替(另:不足目标长度时也会补0): DATA: c(6) VALUE 'bBAAaa' , x(3) TYPE x. x = c. WRITE: x."000000 c = 'BBAAaa'. x = c. WRITE: x."BBAA00 |
|
|
|||||||||
C |
String |
以左对齐的方式将源字段中的字符传输到目标字段中,但不包括尾部空格。目标的长度由传输的字符个数来决定 |
|
||||||||||||
C |
XString |
C→X规则也适用。 如果源中能转换的字符个数是奇数,则会在目标串的最后补一个0 |
|
||||||||||||
|
D |
|
C |
参考 C→C |
|
|
|||||||||
|
D |
|
D |
未转换传送 |
|
|
|||||||||
|
D |
|
F |
如果源字段为合法的 YYYYMMDD 的格式,则会使用该日期与 0001.01.01 日期相减,会得到一个数,这个数会存储到目标字段中;否则如果为非法日期格式,则结果为0 |
|
|
|||||||||
|
D |
|
N |
左对齐将源中的所有字符(不管是否是合法数字字符)都会被传输到目标字段中,如果目标字段过长,则会使用0来填充,如果过短,是会截断源的右边字符。 在传输过程中,源的尾部空格也会被传输到目标字段中。 |
|
|
|||||||||
|
D |
|
I或P |
如果源字段为合法的 YYYYMMDD 的格式,则会使用该日期与 0001.01.01 日期相减,会得到一个数,这个数会存储到目标字段中;否则如果为非法日期格式,则结果为0。 另外,如果目标字段为P类型,源结果如果太大运行时会抛异常 |
|
|
|||||||||
|
D |
|
T |
不支持该类型间转换,将导致语法检查错误信息或运行时错误 |
|
|
|||||||||
|
D |
|
X |
先D→I,再I→X |
|
|
|||||||||
D |
String |
参考C→String |
|
||||||||||||
D |
XString |
先D→I,再I→XString |
|
||||||||||||
|
F |
|
C |
先将源字段转换为<±尾数部分>E±<指数部分(至少占两位)>的格式,然后右对齐传送给C类型字段。 转换后的尾数小数格式(其小数的整数部分只有一位)取值范围为(-10,-1]、0、[1,10)(区间包括小数) 在转尾数部分时,被截部分会使用四舍五入法进行取舍 当F为正数时,尾数部分的正数会自动忽略,但指数总是带符号的 目标字段长度至少应为5字节(当F为0时)或者是6字节(当F非0时) 如果目标字段长度小于最小长度(5或者6字节时),则目标字段结果使用*填充 如果F转尾数部分后,尾数部分的小数位最多不能超过16位(如果多余16位,第17位及后面的会以四舍五入方式截断),且不足时补0,如果目标字段长度超过22字节(F为正时)或23字节(F为负时)时,左边会补空格
DATA: f VALUE '-0.0' TYPE f,c(5)."0E+00 DATA: f VALUE '-0.155' TYPE f,c(5)."***** DATA: f VALUE '-0.155' TYPE f,c(6)."-2E-01 DATA: f VALUE '-0.155' TYPE f,c(7)." -2E-01 DATA: f VALUE '-0.155' TYPE f,c(8)."-1.6E-01 DATA: f VALUE '-0.155' TYPE f,c(9)."-1.55E-01 DATA: f VALUE '-0.155' TYPE f,c(10)."-1.550E-01 DATA: f VALUE '-0.155' TYPE f,c(24)." -1.5500000000000000E-01 |
|
|
|||||||||
|
F |
|
D |
先F→I,再I→D |
|
|
|||||||||
|
F |
|
F |
不会发生转换 |
|
|
|||||||||
|
F |
|
N |
先将源字段F通过四舍五入的方式转换为最接近的整数,然后以右对齐的方式将F转换整数的绝对值传输到目标字段中。如果目标字段过长,则会使用0填充左边,如果过短,则会将左边截断。 |
|
|
|||||||||
|
F |
|
I |
先将源字段F通过四舍五入的方式转换为最接近的整数,然后存储到目标字段中。如果超过目标字段的取值范围,则运行时会抛异常 |
|
|
|||||||||
F |
P |
将源字段F以四舍五入的方式转换为P类型的数据。但不能超出P的取值范围,否则运行时会抛异常 |
|
||||||||||||
|
F |
|
T |
先F→I,再I→T |
|
|
|||||||||
|
F |
|
X |
先F→I,再I→X |
|
|
|||||||||
F |
String |
参考F→C。转换后目标字段的长度为22(为正数时)、23(为负数时) |
|
||||||||||||
F |
XString |
先F→I,再I→XString |
|
||||||||||||
|
N |
|
C |
参看 C→C |
|
|
|||||||||
|
N |
|
D |
参看 C→D |
|
|
|||||||||
|
N |
|
F |
参看 C→F |
|
|
|||||||||
|
N |
|
N |
右对齐传送(包括局部空格),并在左边用0填充或截断 |
|
|
|||||||||
|
N |
|
I或P |
分别参看 C→I或者 C→P |
|
|
|||||||||
|
N |
|
T |
参看 C→T |
|
|
|||||||||
|
N |
|
X |
先N→I,再I→X |
|
|
|||||||||
N |
String |
参看 C→String |
|
||||||||||||
N |
XString |
先N→I,再I→XString |
|
||||||||||||
|
P |
|
C |
右对齐方式传输。当P为负数时,最后一位必为减号“-”;当P为正数且C足够长时,最后一位可以是空格,如果不够,则不会有这个空格。 如果目标字段过长,左边会补空格,如果过短,左边会被截断,且此时第一位用一个星号*表示。 注:不管目标字段固定长度有多长,也不会千分位分隔符出现 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(1)."* DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(5)."*4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(6)."*.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(7)."*3.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(8)."123.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(9)."123.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(10)."123.4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(2)."*- DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(3)."*7- DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(9)."123.4567- DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(10)."123.4567- |
|
|
|||||||||
|
P |
|
D |
P→I,I→D |
|
|
|||||||||
|
P |
|
F |
先将P格式化成 <±尾数部分>E±<指数部分> 格式的F,再对尾数部分的小数部分的第17位(如果小数位足够17位时情况下,没有就补0至16位)四舍五入
DATA: p(16) TYPE p DECIMALS 14 VALUE '-10000.0123456781235',f TYPE f." -1.0000012345678124E+04 DATA: p(16) TYPE p DECIMALS 14 VALUE '10000.0123456781235',f TYPE f." 1.0000012345678124E+0 DATA: p(16) TYPE p DECIMALS 14 VALUE '-1.01234567890123',f TYPE f." -1.0123456789012300E+00 |
|
|
|||||||||
|
P |
|
N |
四舍五入将P转换为整数,然后将其绝对值右对齐传输到目标中。不够时左边补0,超长时截断左边。 |
|
|
|||||||||
|
P |
|
I |
四舍五入将P转换为整数,然后存储到目标字段中。如果超过I取值范围,则抛异常 |
|
|
|||||||||
P |
P |
四舍五入将源字段小数部分格式化成目标字段的小数部分,然后存储到目标字段中。如果超出目标字段的取值范围,则运行时抛异常 DATA: p(4) TYPE p VALUE '12.34567' DECIMALS 5,p2(4) TYPE p DECIMALS 4."12.3457 |
|
||||||||||||
|
P |
|
T |
先P→I,再I→T |
|
|
|||||||||
|
P |
|
X |
先P→I,再I→X |
|
|
|||||||||
P |
String |
右对齐方式传输。当P为负数时,最后一位必为减号“-”;当P为正数时,最后一位是空格。转换时不带千分位分隔符 |
|
||||||||||||
P |
XString |
先P→I,再I→XString |
|
||||||||||||
|
T |
|
C |
参考 C→C |
|
|
|||||||||
|
T |
|
D |
不支持该类型间转换,将导致语法检查错误信息或运行时错误 |
|
|
|||||||||
|
T |
|
F |
如果源字段T只包括数字(不会验证其有效性,如256060都可以),则会按着 hhmmss 格式求秒数:hh*3600+mm*60+ss ,再将结果存储到目标字段中。 如果源字段T只包括了其他非数字,则结果为0。
DATA: t TYPE t VALUE '256060',f TYPE f." 9.3660000000000000E+04 |
|
|
|||||||||
|
T |
|
N |
将源字段左对齐传输到目标字段中,包括空格。如果目标过长,则右边补0,如果过短,右边会被截断 |
|
|
|||||||||
|
T |
|
I |
如果源字段T只包括数字(不会验证其有效性,如256060都可以),则会按着 hhmmss 格式求秒数:hh*3600+mm*60+ss ,再将结果存储到目标字段中。 如果源字段T只包括了其他非数字,则结果为0。 |
|
|
|||||||||
T |
P |
如果源字段T只包括数字(不会验证其有效性,如256060都可以),则会按着 hhmmss 格式求秒数:hh*3600+mm*60+ss ,再将结果存储到目标字段中。 如果源字段T只包括了其他非数字,则结果为0。 如果超过目标字段大小,则运行时会抛异常 |
|
||||||||||||
|
T |
|
T |
不会发生转换 |
|
|
|||||||||
|
T |
|
X |
先T→I,再I→X |
|
|
|||||||||
T |
String |
参考C→String |
|
||||||||||||
T |
XString |
先T→I,再I→XString |
|
||||||||||||
|
X |
|
C |
将源字段中每4位转换成十六进制的字符 0~9、A~F,然后左对齐传输到目标字段中。如果目标字段过长,则右边补空格,如果过短,则右边会被截断 |
|
|
|||||||||
|
X |
|
D |
X→I,I→D |
|
|
|||||||||
|
X |
|
F |
X→I,I→F |
|
|
|||||||||
|
X |
|
N |
X→I,I→N |
|
|
|
||||||||
|
X |
|
I |
只是将源字段中最后4个字节转换为整数,如果源不足4字节,则左边会补十六进制0到4字节后再进行转换。 源的取值可以是:"00000000" to "7FFFFFFF" ,即 0~+2 147 483 647,"80000000" to "FFFFFFFF",即 -1~-2 147 483 648
DATA: x(1) TYPE x VALUE '10',i TYPE i." 16 |
|
|
|||||||||
X |
P |
X→I,I→P |
|
||||||||||||
|
X |
|
T |
X→I,I→T |
|
|
|||||||||
|
X |
|
X |
左对齐传送,如有必要,右边用X'00'进行填充或截断 |
|
|
|||||||||
X |
String |
将源字段中每4位转换成十六进制的字符 0~9、A~F,然后左对齐传输到目标字段中。传输的字符数决定了目标字段的长度 |
|
||||||||||||
X |
XString |
左对齐传送。传输的字符数决定了目标字段的长度 |
|
||||||||||||
|
I |
|
I |
不会发生类型转换 |
|
|
|||||||||
|
I |
|
P |
将源以P类型格式化后存入目标字段中。如果源字段大小超出了目标取值范围,则运行时抛出异常 |
|
|
|||||||||
|
I |
|
F |
将源字段以F类型格式化后存储到目标字段中 |
|
|
|||||||||
|
I |
|
C |
右对齐方式传输(不包括千分位符号)。当I为负数时,最后一位必为减号“-”;当I为正数且C足够长时,最后一位可以是空格,如果不够,则不会有这个空格。 如果目标字段过长,左边会补空格,如果过短,左边会被截断,且此时第一位用一个星号*表示。 DATA: i TYPE i VALUE '123',c(1)."* DATA: i TYPE i VALUE '123',c(2)."*3 DATA: i TYPE i VALUE '123',c(3)."123 DATA: i TYPE i VALUE '123',c(4)."123 DATA: i TYPE i VALUE '123',c(5)." 123
DATA: i TYPE i VALUE '-123',c(2)."*- DATA: i TYPE i VALUE '-123',c(3)."*3- DATA: i TYPE i VALUE '-123',c(5)." 123- |
|
|
|||||||||
|
I |
|
N |
右对齐将源字段的绝对值传输到目标字段中。如果目标字段过长,则在左边补0,如果过短,则将左边截断 |
|
|
|||||||||
|
I |
|
D |
此时I的取值范围只能为1 ~ 3652060,如果超过此范围,则D会以0来填充。如果I有效,则会从0001.01.01日期加上这个天数,则会将得到日期存储到D中 |
|
|
|||||||||
|
I |
|
T |
以I以除86400的余数来表示从午夜00:00:00所经历的秒数,从而转换成相应的时间点后存储到T中。
DATA: i TYPE i VALUE '1',t TYPE t."000001 DATA: i TYPE i VALUE '3601',t TYPE t."010001 DATA: i TYPE i VALUE '86399',t type t."235959 DATA: i TYPE i VALUE '86400',t type t."000000 DATA: i TYPE i VALUE '86401',t type t."000001除以86400后得余数1,以1来计算时间点 |
|
|
|||||||||
|
I |
|
X |
将I的4个字节以高字节序(即人的阅读习惯顺序,程序中的赋值方式只能是高字节序方式)转换为十六进制后,以右对齐方式存储到X字段中。如果X过长,则左边使用十六进制0来填充,如果太短,则会截断左边 |
|
|
|||||||||
I |
String |
右对齐方式传输(不包括千分位符号)。当I为负数时,最后一位为减号“-”;当I为正数时(包括0),最后一位是空格。 |
|
||||||||||||
I |
XString |
将I的4个字节以高字节序(即人的阅读习惯顺序,程序中的赋值方式只能是高字节序方式)转换为十六进制后存储到X字段中 如果I为负数,则目标长度为8。如果I为正数,则目标长度可能为2、4、6、8
DATA: i TYPE i VALUE '0',xstr TYPE xstring."00 DATA: i TYPE i VALUE '1',xstr TYPE xstring."01 DATA: i TYPE i VALUE '256',xstr TYPE xstring."0100 DATA: i TYPE i VALUE '65536',xstr TYPE xstring."010000 DATA: i TYPE i VALUE '16777216',xstr TYPE xstring."01000000
DATA: i TYPE i VALUE '-1',xstr TYPE xstring."FFFFFFFF DATA: i TYPE i VALUE '-256',xstr TYPE xstring."FFFFFF00 DATA: i TYPE i VALUE '-65536',xstr TYPE xstring."FFFF0000 DATA: i TYPE i VALUE '-16777216',xstr TYPE xstring."FF000000 |
|
||||||||||||
String |
I |
参考C→I,并且,如果源字段的长度为0,则结果也为0 |
|
||||||||||||
|
String |
P |
参考C→P,并且,如果源字段的长度为0,则结果也为0 |
|
|||||||||||
|
String |
F |
参考C→F,并且,如果源字段的长度为0,则结果也为0 |
|
|
||||||||||
|
String |
C |
参考C→C,与此规则不同的是,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用空格来填充 |
|
|
||||||||||
|
String |
N |
参考C→N,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充 |
|
|
||||||||||
|
String |
D |
参考C→D,与此规则不同的是,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充 |
|
|
||||||||||
|
String |
T |
参考C→T,并且源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充 |
|
|
||||||||||
String |
X |
参考C→X,如果源字段长度为0,则会使用十六进制的0来填充目标字段 |
|
||||||||||||
|
String |
String |
不会发生转换。只是目标字段会重新指向源字段字符串 |
|
|
||||||||||
|
String |
XString |
参考C→XString。如果源字段长度为0,则目标字段的长度也会是0 |
|
|||||||||||
|
XString |
I |
参考X→I,并且,如果源字段的长度为0,则结果也为0 |
|
|||||||||||
|
XString |
P |
参考X→P,并且,如果源字段的长度为0,则结果也为0 |
|
|||||||||||
|
XString |
F |
参考X→F,并且,如果源字段的长度为0,则结果也为0 |
|
|||||||||||
|
XString |
C |
参考X→C。如果源字段的长度为0,则目标字段为会使用空格来填充 |
|
|||||||||||
|
XString |
N |
参考X→N,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充 |
|
|||||||||||
|
XString |
D |
参考X→D。如果源字段的长度为0,则目标字段为会使用0来填充 |
|
|||||||||||
|
XString |
T |
参考X→T。如果源字段的长度为0,则目标字段为会使用0来填充 |
|
|||||||||||
|
XString |
X |
参考X→X,如果源字段长度为0,则会使用十六进制的0来填充目标字段 |
|
|||||||||||
|
XString |
String |
参考X→String。如果源字段长度为0,则目标字段的长度也会是0 |
|
|||||||||||
|
XString |
XString |
参考X→XString。如果源字段长度为0,则目标字段的长度也会是0 |
|