2010-11-24 17 views
2

1 char = 1バイト= 8ビット(32ビットシステム)です。その後、char size confusion

char c=0xffff0000; //wrong 

charはちょうど8ビットと、ファイル内のすべての文字も8ビット長の許可理由。

ありがとうございました。 = 8ビット

+5

1バイト= 8ビット。 – cpx

+3

しかし、この質問に良いタイトル。 –

+2

@ Dave18:バイトは必ずしも8ビットではありません - 最近ではもっとも一般的な値になります –

答えて

16

いいえはsizeofチャーは、定義1であるが、これは常に32ビット/ 8ビットを占めることを意味するものではありません。

$ 3.9.1/1 - 「の文字(文字)として宣言されたオブジェクトは 実装の基本的な文字セットの任意のメンバーを格納するのに十分な大き しなければなりません。」

バイトが8ビットであるという混乱があるようです。しかし、C++標準はこれを強制するものではありません。

はここで$はC + +メモリーモデルにおける基本的なストレージユニットがバイトで1.7/1バイトが標準で定義されているか

です。バイトは、少なくとも十分な大き 基本実行文字セットの任意のメンバーを含有することであり、 を実装定義さ 数のビットの 連続配列、から構成されています。

明らかなように、バイトは必ずしも8ビットである必要はありません。

+2

バイトが8ビットでないシステムを知っていますか?好奇心。 –

+0

@スティーブタウンゼント:いいえ。私のプログラミングの世界は90年代後半から始まります:) – Chubsdad

+2

私は、一部のDSPには1バイトの12ビットが入っていると聞いています。 – botismarius

0

1バイト

+1

今はほとんど普遍的ですが、必ずしもそうではありません。 C++標準は、(@Chubsdadによってポストされた見積もりによるような)6ビットバイトのコンピュータに対応しています。 –

+3

@larsmans:実際はそうではありません。 CHAR_BITは少なくとも8でなければなりません。 –

+0

@Fred Nurk:あなたは正しいですし、C++で必要な文字セットのサイズを誤って計算しました。 6,5ビットは、それらを格納する最小の 'char'サイズです。 –

0

1バイトは32ビットではありません。どんなシステムであっても、バイトは常に8ビットです。

「32ビット」というシステムは、「ワード」サイズが32ビットであることを意味します。言い換えれば、データは32ビットのチャンクでシステムの周りに転送されます。

+5

いいえC++標準のようなバイトは8ビットではありません常に私の答えを参照してください – Chubsdad

+2

@Chubsdadは正しいです。 C++(およびC)では、byte(バイト)とchar(文字列)は同じ(実装定義の)サイズです – paxdiablo

4

システムが「32ビット」として分類されているという理由だけでは、32ビットのバイトを使用するわけではありません。

アーキテクチャ上(x86やx86-64など)でも可能な限り、バイトは(システムに依存した方法で)最小のアドレス指定可能なメモリとして定義され、多くのアーキテクチャではまだ8ビットです大量のデータをレジスタで処理しています(それぞれ32対64)。このような考え方をしている場合は、「バイト」の意味がアーキテクチャの変更に伴って変化するため、「オクテット」という言葉を8ビット単位で使用することがよくあります。

対照的に、「バイト」は常に8ビットであると定義されている人もいますが、質問の混乱は恐らく決して起こりません。などです。 32ビットシステムは32ビットとなる。

もちろん、システムを「n -bit」と分類するという全体の考え方は、非常に単純すぎます。

Cでは、常に#include <limits.h>にしてからCHAR_BITマクロを使用して、コンパイラターゲットのcharデータ型のビット数を取得できます。

1

charのビット数は、通常8(1バイト/オクテット)です。正確な番号は<climits>のようにCHAR_BITと定義されています。

0

すでに作成された点に加えて、sizeof(char)と文字のサイズが必ずしも同じではないことに注意してください。

マルチバイト文字セットは文字あたり1バイト以上を取ることができます。たとえば、Unicode文字は常に1バイト以上(sizeof(wchar_t))を占有します。

このトピックに関するMicrosoftのドキュメントはhereです。混乱を招くように、文字セットによっては、文字ごとに固定されたバイト数を使用しないものもあります。

+0

"Unicode文字は常に2バイト(sizeof(wchar_t))は、sizeof(wchar_t)が常に2であることを示唆します。実際には共通の値が4であり、〜100.000 Unicode文字があるため意味があります。 – MSalters

+0

@MSalters - 私はそれを知らなかった、ありがとう。 –

+1

少なくとも、通常のコンパイラと同じようになっていますが、標準の観点からはまだいくつかのコメントがあります。 "マルチバイト文字"はCとC++でよく定義されていますが、それらは 'wchar_t 'ではありません。代わりに、マルチバイト文字(MBC)は、複数の 'char' ==バイトのシーケンスです。 Shift-JISまたはUTF-8はそのような文字を使用します。 'wchar_t'はマルチバイト文字と無関係なので、' sizeof(wchar_t) 'は常に> 1であると推論することはできません。 – MSalters

2

チャーは常にバイトであり、常に大き有する1

バイトは常に、少なくとも8ビットを有するが、いくつかのシステムの詳細を有することができます。

32ビットシステムでは、CまたはC++でアドレスバスのサイズを参照します。これは、バイトサイズではなくポインタのサイズと考えることができます。

2

チャーは、私は常に8ビットとしてこれを見ている80X86マシンで[#include <climits>から】CHAR_BITビット

を有しています。
TMS320C54xおよびTMS320C55x DSPでは、これを16ビットと見なしています。これは痛みでした。なぜなら、メモリを節約するためには、文字列ごとに2つのASCII文字を格納しなければなりませんでした。

常に、sizeof(char) == 1