- ベストアンサー
COBOLのデータ型とは?S9(6)の意味や他言語(C言語)での実現方法を知りたい
- COBOLのデータ型であるS9(6)は符号ありの整数を表すものです。しかし、S9(6)の値が「00000A」となっていることから、Aが何を意味しているのか疑問が生じました。調査の結果、Aはゾーン10進数と呼ばれる特殊な数値を表す記号であることがわかりました。
- ゾーン10進数はCOBOLに特有の表現方法であり、その詳細な意味を知ることは困難です。COBOLにはゾーン部を明示的に指定する記述方法は存在しないようです。
- S9(6)というデータ型を他の言語(C言語)でどう実現するかについては、具体的な方法を提供することはできません。S9(6)はCOBOLのデータ型であり、他の言語では同等の表現が存在しない場合もあります。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
00000A→000001+ 00000B→000002+ 00000C→000003+ ・ ・ 00000K→000002- 00000L→000003- となります。 KKKKKK→111111- KLKLKL→121212- ではありません。最終桁にのみ、符号が乗るのです。 111111- なら 11111J 121212- なら 12121K です。 注意>0+は'{', 0-は'}'です。AやJではありません。 データを変換なさるのですか? ならば、最終桁だけ変換が必要です。
その他の回答 (7)
- root139
- ベストアンサー率60% (488/809)
#4です。補足ありがとうございます。まず EBCDIC と思って間違い無さそうですね。 既に回答が付いていますので、少しだけ。 しつこい様ですが、慣れるまでは1バイト上下2段の16進表記で考えた方が良いと思いますよ。 例えば、-121212 の場合、下記の様になります。 F F F F F D ← 1~5桁は「F」固定。6桁目は「C」(+)か「D」(-) 1 2 1 2 1 2 ← 下の段には十進数の数値がそのまま入る 上の段(上位4bit)が「F」の場合は、EBCDICでは下の段(下位4bit)の値そのものの数字になります。 最後の桁は上の段(上位4bit)が「C」か「D」になりますが、「C」の場合はEBCDICでは「{」とA~I、「D」の場合はEBCDICでは「}」とJ~Rとなります。 従ってこの場合は、文字列表現が「12121K」となります。 逆に考えると、文字列表現で、1~5桁に数字以外のものが含まれる場合や、6桁目に「{}」とA~R以外の文字が入っている場合は S9(6) としては不正です。 なお、環境によっては「{」「}」と書いたところが別の文字になる場合も有るようです。 それから、実際の変換作業では、データがEBCDICのまま来るのかASCII等に変換されて来るのかでかなり変わってくると思いますよ。
お礼
なるほど、ありがとうございました
- notnot
- ベストアンサー率47% (4900/10358)
No2です。 すいません。00000Aを、十六進表記だと思い込んでいました。
- kinta03
- ベストアンサー率41% (7/17)
お疲れ様です。 以前に回答を寄せたQAですが 少しは参考に為るかと思います。 http://okwave.jp/qa/q7985639.html
お礼
参考にさせていただきます。 ありがとうございました。
- root139
- ベストアンサー率60% (488/809)
まず、どんな環境でどの様にファイルを表示した際に「00000A」と表示されたのか補足して下さい。 また、今日日の一般的なPCやUNIX系OSの文字コードはASCII系統ですが、COBOLがよく使われる汎用機の環境では全く異なるEBCDICという系統の文字コードで有ることも多いですので、分かれば文字コードも書いて下さい。 http://ja.wikipedia.org/wiki/EBCDIC http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3J3820/ISUS0268.HTM ただ、断定は出来ませんが、#1さんの書かれている通り、EBCDICで+1を表したものという線が強いかと思います。 EBCDICの「00000A」を、16進数表記で1バイトを上下2段にして書くと下記の様になります。 F F F F F C 0 0 0 0 0 1 下の段はそのまま符号を除いた値になると考えて下さい。 上段の1~5桁目の「F」(1111)はゾーンといって数値である事を表しているだけです。最後の桁の「C」(1100)はプラスで有ることを表しています。マイナスの場合は「D」(1101)です。 ただし、「F」「C」「D」は文字コードや環境によっては違う値になる場合も事も有ります。
補足
現在会社から与えられたCOBOLソースを眺めて解析しているだけの状態です。その為COBOLの開発環境はありませんです。 ただソースを見るとEBCDICという表記があるのでEBCDICだと思います。
- maiko0318
- ベストアンサー率21% (1483/6969)
No1です。 >1バイト(8ビット)の下位4ビットで表現出来ます。 > (0000,0001,0010,0011,0100,0101,0110,0111,1000,1001) ↑ 0000が抜けていました。m(__)m
- notnot
- ベストアンサー率47% (4900/10358)
ゾーン十進数とは、8bitずつで十進1桁を表して、それぞれの桁の下4bitが数字を表します。下4bitは必ず0~9です。なので、00 00 0A というのはあり得ません。 おそらく S9(6) ではなくてさらに comp とかついてたのでは? comp ・・・・ 二進数の整数 ( Cだと int とか short int とか long long int とか) comp-1 ・・・・ 単精度実数 ( Cだと float ) comp-2 ・・・・ 倍精度実数 ( Cだと double ) comp-3 ・・・・ パック十進数 ( Cの型には無し ) しかし、どれにしても、00 00 0A というのは変ですね。なんか間違えてませんか? あと、どこのメーカーのCOBOLですか?
- maiko0318
- ベストアンサー率21% (1483/6969)
S9(6)ですが、6バイト使います。10進数ですから、 1バイト(8ビット)の下位4ビットで表現出来ます。 (0001,0010,0011,0100,0101,0110,0111,1000,1001) 上位4ビットは1111が入っていますが1の位のみ、符号が入っています。 (1111は符号なし、1100が+、1101が-です。 一の位以外は f0,f1,f2,f3,f4,f5,f6,f7,f8,f9で格納され、EBCDICコードにより0,1,2,3,4,5,6,7,8,9と判断されます。 一の位は+の時、 c0,1,c2,c3,c4,c5,c6,c7,c8,c9で格納され、EBCDICコードにより{,A,B,C,D,E,F,G,H,Iとなります。 位置の位が-の時、 d0,d1,d2,d3,d4.d5.d6.d7.d8.d9で格納され、EBCDICコードにより},J,K,L,M,N,O,P,Q,Rとなります。 ということで、00000Aは000001+でした。 C言語になさるなら、intでいいですよ。ただし、7桁入るときは6桁に切られることをお忘れなきよう。
補足
なんとなく理解できたのですが、一番知りたいことは 00000A→000001+ これをCで実現する場合、相互の変換プログラムが必要だと思います。それをどう実現するかです。 上記の回答だけを見ると 00000A→000001+ 00000B→000002+ 00000C→000003+ ・ ・ 00000K→000001- 00000L→000002- という変換になる感じですが合ってますでしょうか? KKKKKK→111111- KLKLKL→121212- という変換になるという認識ですが・・あってるかな これが合ってる場合文字1文字1文字見て行って変換する処理にしようかと考えています。
お礼
よくわかりました。ありがとうございました。