基本类型赋值转换规则表

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4292854.html

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

时间: 2024-10-05 09:29:49

基本类型赋值转换规则表的相关文章

内表、结构赋值转换规则

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4292904.html 内表转换规则... 57 C语言中的结构对齐... 57 ABAP结构体对齐... 58 结构体相互赋值转换规则... 59 MOVE-CORRESPONDING(结构体赋值)... 62 内表转换规则 内表只能被转换

Delphi XE6记录类型赋值

program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; TYPE Trec = record Member1, Member2: Integer; end; CONST IntRec: Trec = (Member1: 55; Member2: 2); begin Writeln(IntRec.Member1); Writeln(IntRec.Member2); Readln; end. 定义的时候,是可以进行赋

编程题:为枚举类型变量赋值。将整型值强制类型转换成枚举类型赋值

编程题:为枚举类型变量赋值.将整型值强制类型转换成枚举类型赋值 #include<stdio.h> void main() { enum season {spring,summer,autumn,winter}s1,s2; s1=summer; s2=(enum season)2; printf("s1=%d,s2=%d\n",s1,s2); } 编程题:为枚举类型变量赋值.将整型值强制类型转换成枚举类型赋值,布布扣,bubuko.com

使用头文件cfloat中的符号常量获知浮点类型数据的表数范围---gyy整理

使用头文件cfloat中的符号常量获知浮点类型数据的表数范围 cfloat头文件包含了系统的浮点数的长度限制 头文件climits中的符号常量是获知整型数据的表数范围,并不能获取浮点类型数据的表数范围. <climits>该头文件包含了系统的整数长度的限制,它已取代了头文件<limits.h> <cfloat> 该头文件包含了系统的浮点数的长度限制,它以取代了头文件<float.h> <cfloat> 头文件各字符常量的取值和含义 上图中在程序中

wcf 数值类型赋值不能的问题解决

客户端给对象int类型赋值,服务端收到值为0 网上给出的方案 1.数值型字段+isrequired属性.能解决问题,但没有说明原因.数值型默认不赋值,不科学. 2.emitdefaultvalue.没试过个人感觉也不科学. 自己摸索出的方案 1.字段赋值/字段isspecified=true.能解决问题,但也不科学. 最后发现 引用服务时,高级设置里如果取消勾选“重新使用引用程序集中的类型” ,则客户端生成的引用代码将不含 System.Runtime.Serialization.IExtens

Swift语言—常量、变量、类型赋值

常量:常量在作用域内不能被赋值且不会发生改变,只读不写,每个常量都必须有唯一的名字和内存空间:关键字:let   变量:变量在作用区域内可以它的值可以被改变,可读可写可覆盖,每个常量都必须有唯一的名字和内存空间:关键字:var   变量类型赋值: Var str = “Hello”   Var s: String = “World”   Var i:Int = 100 Var world:String =”wojiaoadong”

jQuery使用serialize(),serializeArray()方法取得表单数据+字符串和对象类型两种表单提交的方法

原始form表单值获取方式(手动): $.ajax({ type: "POST", url: "ajax.php", data: "Name=摘取天上星&position=IT技术", success: function(msg){alert(msg);}, error: function(error){alert(error);} }); JQ serialize()方法取值: $.ajax({ type: "POST&quo

C#值类型赋值与引用类型的赋值

在C#中,数据类型大致可以分为两类,一类是值类型,一类是引用类型.初学者往往会被类型之间的相互赋值搞的很迷惑,尤其是引用类型变量的相互赋值. 现在举2个例子,来一一说明. 值类型变量的赋值: 值类型变量中保存的是实际数据,在赋值的时候只是把数据复制一份,然后赋给另一个变量. 例子1: int var1=2; int var2=var1;  //编译器会先复制var1的值,然后把它赋给var2.很明显var2的值也为2 引用类型变量的赋值:  引用类型变量中保存的是“指向实际数据的引用指针”.在进

Spring-IOC:复杂值注入、各种类型赋值、bean的复用

复杂值注入准备工作 从这里开始我们要进行复杂值的注入 创建 Car public class Car { // 写入有参无参setget... private String carName; private Integer price; private String color; } 创建Book public class Book { // 写入有参无参setget... private String bookName; private Integer price; } Person类 pub