2017-02-23 195 views
0

我想了解COMP用法子句中的COBOL變量如何存儲值。COBOL中用法COMP的變量

我試圖一例如下

01 VAR14   PIC S9(5) USAGE COMP. 

    MOVE 12345 TO VAR14 
    DISPLAY VAR14 

在SPOOL的VAR14值來作爲0000S9(5) COMP根據手冊大小是4個字節,所以我的理解是VAR14應顯示爲000。 二進制表示如下:

0000 0000 0000 0000 0011 0000 0011 0100‬ 

可有人請理解產值0000幫助嗎?

感謝

+0

正確的二進制:0000 0000 0000 0000 0011 0000 0011 1001 – Ashi

+1

爲什麼不找到四字節二進制可以容納的最大值,然後計算出有多少位?另外,我建議你將TRUNC(BIN)作爲二進制字段的編譯器選項(請查看編譯列表的開頭部分)。如果您在您的ID DIVISION標題前添加CBL TRUNC(STD),然後再編譯並再次運行,請更新您的問題(編輯問題下的鏈接),並將結果輸入。 –

+0

@Ashi - Bill的答案中有什麼缺失?如果不是,它解決了你的問題(它似乎做了什麼):請接受答案。如果有遺漏請留下評論。 –

回答

6

在IBM的企業COBOL,有定義的二進制字段四種方式:COMP; COMP-4; BINARY; COMP-5。

這是怎麼回事? COMPUTATIONAL字段(COMP簡稱COMP,簡寫爲「所有COMPUTATIONAL字段」)是「implementationor defined」。這意味着在一個編譯器中COMP是什麼,在另一個編譯器中可能是COMP-somethingelse,或者甚至可能沒有直接的等價物。

是的,如果你願意,你可以編寫COMPUTATIONAL,COMPUTATIONAL-4和COMPUTATIONAL-5。編譯器會很高興。爲了使事物標準化,1985年的COBOL標準引入了BINARY和PACKED-DECIMAL作爲用法。爲了可移植到其他COBOL編譯器,這些將是COMP和COMP-3(壓縮十進制)字段的最佳用法。

這些不同的二進制字段有什麼區別?大多數都沒有。 COMP,COMP-4和BINARY在編譯器中實際上是彼此的同義詞(更準確地說,COMP-4和BINARY是COMP的同義詞)。

COMP-5,也稱爲「本地二進制」,是不同的。 COBOL有你可能稱之爲「十進制二進制」字段(COMP和兄弟)。也就是說,數據以二進制形式存儲,但其最大值和最小值是在定義中使用的PICture子句的數量和全部值。

COMP PIC 9 - can contain zero to nine. 
COMP PIC S99 - (signed) can contain -99 to +99. 
COMP PIC 999 - can contain zero to 999. 

COMP-5是不同的。

COMP PIC 9 - can contain zero to 65535. 
COMP PIC S99 - (signed) can contain -32768 to +32767. 
COMP PIC 999 - can contain zero to 65535. 

爲COMP-5發生的是該圖像是用於定義字段的大小(與其他二進制字段),但是每一個可能的位值是有效的。

圖片如何與定義的大小相關? PIC 9到PIC 9(4)將存儲在半字大小的字段(即兩個字節)中。 PIC 9(5)至PIC 9(9)將存儲在一個字大小的字段中(這是四個字節)。 PIC 9(10)至PIC 9(18)將存儲在雙字大小字段(8字節)中。

OK,那麼這種差異(COMP-5使用所有位,COMP只能表示PICture的十進制值)是如何影響定義的? 「本地二進制」聽起來不會好得多,而且明顯快於「非本地」會給出的東西?

區別在於它們如何截斷。而且,如同「本地二進制」聽起來一樣閃爍,它通常比使用CO更慢,因爲截斷。

COMP將截斷爲PICture的十進制值。 COMP-5截斷到字段的大小。

考慮(名稱只是爲了示範,永遠只使用描述性的名稱):

01 PROGA COMP PIC 9(4). 
01 PROGB COMP-5 PIC 9(5). 
01 PROGC BINARY PIC 9(4) VALUE 9999. 

ADD PROGC TO PROGA 
ADD PROGC TO PROGB 

記住,PROGA有9999的最大值,並指出,19998領域的現有規模內,很容易適應,在編譯器可以影響添加,然後截斷爲十進制值,全部就地。

記住PROGB的最大值爲65535,並且絕對有可能在原始字段中有足夠的空間成功添加更多的65535,編譯器必須生成一個臨時字段,其大小爲原來的兩倍添加,然後截斷回原始最大值,將結果返回到原始字段。

ADD 1 TO PROGA 
ADD 1 TO PROGB 

需要注意的是這兩個,加1 PROGA,因爲它是小於9999,仍允許添加到地方(顯然)來完成,但加1 PROGB將仍然需要擴張的領域和所有這些,因爲PROGB的值已經是65535了,所以編譯器必須考慮到這一點。

來到顯示器。你有COMP PIC S9(5),你會得到一個10位輸出。爲什麼?好的,你制定的大小,該字段是四個字節長。但是,這應該會得到一個五位輸出,範圍爲-99999至+99999。讓我們暫時假裝你的領域是COMP-5 PIC S9(5)。

使用COMP-5,所有位都是有效的,對於有符號字段,全字/字的範圍是-2,147,483,648到+2,147,483,647。這是10位數字,注意。與您在輸出中獲得的10位數字匹配。發生了什麼?

編譯選項TRUNC。如果使用編譯器選項TRUNC(BIN),則所有COMP/COMP-4/BINARY字段都被視爲COMP-5。故事結局。您有TRUNC(BIN),可以由您,您的項目或您的站點默認選擇。這不一定是一個好的選擇。

編譯器選項TRUNC的其他值是STD,它爲COMP/COMP-4/BINARY執行「正常」截斷,而OPT在當時執行任何最佳(用於執行)。

請注意,TRUNC(OPT)強加給程序員一份合同。 「我不會,也絕不會考慮,允許COMP/COMP-4/BINARY字段的值不符合它的圖片,如果我這樣做,這全是我的錯,全是停頓,故事結束,並且不會從我哭泣「。

除了研究事情的工作方式外,不要爲了調查工作方式而改變TRUNC設置。如果你這樣做,你可以破壞事物,這可能是一個非常微妙的突破。我的建議是:TRUNC(BIN),除非你必須(有人決定,你別無選擇),否則不要使用它。如果您的網站害怕合同,則使用TRUNC(STD);如果您的網站對合同感到滿意,則使用TRUNC(OPT)。

對於單個字段定義,請使用COMP-5,在需要的地方。你需要什麼?對於任何你有一個二進制字段的地方,其範圍超過其圖片的「十進制值」。例如,查看CICS COMMAREA的大小以及指示單個示例有多大的字段。在COBOL程序中查找VARCHAR主機字段。與JAVA或C/C++通信的數據可能就是這樣。否則,對於新程序,更喜歡BINARY,這表明您在1985年時更新最新版本。

爲調查目的設置TRUNC。

 CBL TRUNC(STD) 
     ID (or IDENTIFICATION) DIVISION. 

編譯器選項也可以通過JCL中的PARM語句來編譯,但您可能無法訪問它。 CBL將覆蓋PARM中設置的任何值。有一個安裝選項可以防止使用CBL(也稱爲PROCESS)。個別選項也可以在安裝時「固定」。如果您的網站固定了TRUNC或阻止了CBL,那麼您將無法嘗試這些事情。