17

この質問はここから始まります。VSでこのステートメントを試して、何が起こるかを確認しました。

Len(Name <= 3)

この回答これによると、ブール値は4バイトを消費するはずです。MSDNによると、VBのLen関数

文字列内の文字数または変数の格納に必要な公称バイト数のいずれかを含む整数を返します。

Name <= 33をStringに変換し、ブール値を返す文字列比較を実行するLen必要があるため、その中のバイト数を評価する必要があります。これは4である必要があります。何らかの理由で、上記のコードは2番目のパラメーターに関係なく2を返します。言い換えると、Len(True)2も返します。異なるプラットフォームターゲット(32と64)で試してみました-同じことです。

なぜLen(Boolean)4ではなく2を返すのですか?

4

2 に答える 2

16

ユーザー定義型とオブジェクト変数を使用すると、Len関数はFilePut関数によってファイルに書き込まれるサイズを返します。オブジェクトに文字列が含まれている場合は、文字列の長さを返します。オブジェクトに他のタイプが含まれている場合、FilePut関数によってファイルに書き込まれるときにオブジェクトのサイズが返されます。

Len()はレガシー関数であり、前世代のVisualBasicプロジェクトから移植されたコードでのみ使用する必要があります。VB値のバイナリシリアル化を含むコードで通常表示される場所。それらの古いバージョンでは、基本タイプのサイズが異なっていました。 Integerたとえば、16ビットでした。これは、Longを使用するWebで見つかった多数の不正なピンボーク宣言を説明しています。そしてBoolean、16ビット値のVARIANT_BOOLでした。Trueさらに、その値を1ではなく-1に変換することで風変わりです。

明らかに.NETサイズを採用することは、VB6プログラムによって書き込まれたファイルに存在する多くのデータに大きな打撃を与える変更でした。または、TCP接続を介して送信されるバイナリデータ。その他。したがって、Len()関数はレガシーサイズを返します。

于 2013-01-20T15:44:56.193 に答える
2

MSDNのデータ型の概要(VS2012)によると、ブール値のサイズは実装プラットフォームによって異なります。ただし、VS2003の同じページを見ると、ブール値は2バイトであると表示されます。

ECMA-335セクションIII.1.1.1は次のように述べています。

評価スタックは4バイトまたは8バイトの整数のみを保持しますが、他の場所(引数、ローカル変数、静的変数、配列要素、フィールド)は1バイトまたは2バイトの整数を保持できます。スタック操作の目的で、bool(§III.1.1.2)型とchar型は、それぞれ符号なし1バイト整数と2バイト整数として扱われます。これらの場所からスタックにロードすると、4バイトの値に変換されます

そしてセクションIII.1.1.2は次のように述べています。

CLIブール型はメモリ内で1バイトを占有します。すべてゼロのビットパターンは、falseの値を示します。1つ以上のビットが設定されたビットパターン(ゼロ以外の整数に類似)は、trueの値を示します。スタック操作の目的で、ブール値は符号なし1バイト整数として扱われます


それを考えると、なぜあなたが1ではなく2を得るのかについて私はもっと混乱していると感じます

于 2013-01-20T15:40:40.763 に答える