2011-07-19 12 views
8

整数と文字列はどのように低レベルで比較されますか?質問は、任意の特定の言語のためではありません、我々は今、私が求めています何システムレベルでの整数と文字列の比較

int a = 11; 
int b = 12; 

compare(a,b); //Just an example comparison, not in any particular language. 

そして

String a = "11"; 
String b = "12"; 

compare(a,b); 

を使用するときと同じように、これら2つの比較間のシステム・レベルの差がある何ですか?、それだけで、一般的な問題です。また、文字列から整数への変換/比較、またはその逆でもありません。私は答えが異なるプラットフォームと異なる言語で異なるかもしれないことを知っていますが、私はこれについての手掛かりがないので、私は一般的な質問をしています。

なぜ整数比較が常に考慮される文字列の比較?

答えて

12

通常、文字列または整数(最も単純な形式)はバイト単位で比較されます。

cmp a, b 

(32ビットのint、32ビットまたはそれ以上のプロセッサを仮定して)かなり高速で実行:

だからint型、例えば、それは、単一のCPU命令になります。これは、CPUレジスタに収まる単一の比較です。

しかし、文字列はより複雑です。最も単純な場合、次のようになります。

foreach (character c in string a, character d in string b) 
    cmp c, d 

文字列ごとにループする必要があります。文字列の長さが異なる場合は、その文字列を処理する必要があります(intは同じサイズであることは明らかです)。

より複雑なレベルでは、ロケールとさまざまな文字セットを使用すると、各文字列の文字数は2〜4バイトになり、いくつかの文字(アクセント記号など)は、異なるバイト値を持つにもかかわらず、より多くの処理と処理が必要となり、作業の増加はほとんど常に遅くなります。

正確な動作は、ロケール、文字セット、および言語によって異なります。いくつかの言語(C#など)では長さの文字列を格納し、他の言語(C)は単に文字配列を格納します。文字列処理用に他の言語を設計したり、それを処理する最適化されたライブラリを用意しておくと、コストを削減できます。

興味深いことに、理論的には、ASCII文字列を使って作業する場合、3文字以下の文字列を比較することは、intを比較するのとほぼ同じくらい速くなる可能性があります。その場合、それは関係するメモリの量と関係があります(ASCIIの場合strcmpは内部でmemcmpを使用できますが、これはおよそ==が使用するものです)。これは、長さ(intであってもよい)を単純に比較することができるので、文字列の長さを先頭と0の長さ(空の)文字列に格納する言語でも当てはまります。

+0

文字列の比較は、必ずしも文字列全体を見る必要はありません。それはそれが違いを見つけるとすぐに停止することができます。 – MRAB

+0

@peachykeen最後のparaはとても役に立ちました... – buch11

+0

2桁の文字列が2バイトに格納され、整数が4バイトに格納されます(Cプログラムについて)。あなたは、文字列の比較よりもバイト単位で行われる比較が2comparisonだけとなり、整数は4をとると言いました。本当ですか? –

2

整数、文字列が数字につき1つの文字として格納され

(OSに依存して)結合バイトを取り、1とゼロの単一セットとしてバイナリで表された整数値として格納され、それぞれそのバイトにビットパターンを使用します。

あなたの例では、文字列は、intに比べて表現するのに要するバイト数の約2倍を占めています。

+2

C/C++およびその他のさまざまな言語では、intは通常4バイトであり、文字列は1文字あたり1バイトになる可能性があるため、末尾のヌルでも文字列は小さくなります。また、シングルバイト長と末尾のヌル、または2バイトのlenとnullを使用しない言語でも可能です。文字列文字あたりのバイト数も大きく異なります。 – ssube