По принцип сте извършили незаконно MOVE
. Преместването на буквено-цифрови в цифрови полета е валидно при условие, че съдържанието на буквено-цифровото поле съдържа само цифрови знаци. Този препратка обобщава валидни/невалидни ходове.
Какво очаквахте като резултат?
Преместванията на буквено-цифрови полета в цифрови се извършват без „преобразуване“. По принцип просто сте пуснали една цифра, последвана от два интервала в числово поле. '1' беше добре, двата интервала не бяха. Последните два байта на WS-VAR-NUM
съдържат интервали.
Но чакайте... защо последният знак е нула? Отговорът на това е малко по-сложен. Елементите, декларирани като PIC 9
нещо, са представени в Zoned Decimal. Всяка цифра от зонирано десетично число е представена от един байт. 4-те бита от висок ред на всеки байт са зонови битове; 4-те бита от висок ред на байта от нисък ред представляват знака на елемента. 4-те бита от нисък ред на всеки байт съдържат стойността на цифрата. Ключът тук е къде се съхранява знакът. Той е в битовете от висок ред на последния байт. Вашата декларация не включва знак, така че операторът MOVE
издухва битовете на знака и ги заменя с цифрови битове от висок ред по подразбиране (не забравяйте, че единствените валидни знаци за ПРЕМЕСТВАНЕ са цифри - така че този процес на корекция винаги трябва да дава валиден резултат). Битовете от висок ред на зонирана десетична цифра без знак винаги са HEX F. Какви са битовете от нисък порядък на последния байт? Интервалът има ebcdic HEX стойност 40. Нула е HEX F0. Тъй като операторът MOVE "поправя" знака автоматично, вие завършвате с HEX F0 в цифрата от нисък ред, която се оказва, както познахте, нула. Нито една от другите „цифри“ не съдържа знакови битове, така че те са оставени както са били.
И накрая, оператор DISPLAY
преобразува зонирани десетични полета в тяхното еквивалентно символно представяне за представяне: Нетният резултат е: '1 0'.
BTW Горната дискусия е как работи на IBM z/OS платформа - други набори от символи (напр. ASCII) и/или други платформи може да дадат различни резултати, не защото IBM прави грешното нещо , но защото програмата извършва незаконно MOVE
и резултатите по същество са недефинирани.
person
NealB
schedule
26.05.2011
IF WS-VAR-NUM EQUAL 1 THEN ...
, за да проверите истинското съдържание. - person Dr. belisarius   schedule 26.05.2011