DESC
型とは Address がさすビット列データの意味のこと。
Object がもつことができる[ 値の集合 ]と, それに適用できる演算を決めるもの
Computer で扱う Object は変数と定数のみ
定数は. int 型である
// 整数とみれば, 64
010101010
// char という意味でみれば 'A'
010101010
■ 整数
int が 4byte の場合では, -2億 - 2億 の範囲の値の整数を扱うことができる。
C にある 型は 4 種類
char : 1 byte
int : ハードウェアが扱う整数
float
double
さらに修飾子がついて long short ( 整数型のみ有効 )
int は HW( 計算機によって異なる )
Compiler は HW の仕様にあわせて, int のサイズを決めることができる。
C の仕様では以下の規則しかない。
int のサイズが 4 byte というのも厳密には保障されない。
short < = int < = long
WARNING
int は掛け算が苦手なので、int の範囲を超えるような掛け算をする場合は float 型をつかう
// BAD
int i = 50000;
printf( "%d\n", i*i );
// OK
float f = 50000;
printf( "%f\n", f*f );
■ size_t
POINT
符号なし整数 を typedef したもの
そのため厳密には環境ごとで型のサイズがことなる。
32bit 環境ではたいてい unsigned int ( 4byte )
■ float
基数表記
0.5を浮動小数点数で表すと、基数が10の場合は5.0×10-1(5.0e-1)、基数が2の場合は1.0×2-1となる。
WARNING
float に誤差が発生するため(float という表現) a = 0.1; if( a == 0.1 )
WARNING
扱える値の範囲を大きくしたかわりに 精度を犠牲にしているので
大きな値と小さな値を同時に利用しないこと。
float も int も 4byte なら扱える値は同じ数しかということ。
float f = 50000;
float f2 = f*f;
// 2500000000.000000
printf( "%f\n", f2 );
// +1 は精度が足りないため, 丸められる。
// 2500000000.000000
f2 = f2 + 1;
printf( "%f\n", f2 );
カウンタとして利用すると 1600 万あたりで増えなくなる。
float f = 0;
int i = 0;
for( i=0; i< 1024*1024 * 24; i++ ){
f += 1;
}
// 16777216.000000 25165824
printf( "%f %d\n", f, i );
■ boolean とは
定義:
false 0: true 未定義
正しい例
if( status_check() )
理由
zero 比較の結果は簡単に作成できるが、それ以外の値の比較は
operation がひとつ増える
■ uintptr_t
DESC
ptr を 整数に変換する
問題は ptr size が int と同じサイズとは限らないこと
64 bit binaryでは, sizeof(int) = 4, sizeof(void *) = 8
int 型も Compiler により, 64bit 環境では size が異なるらしい
GCC : sizeof ( int ) = 8
VS : sizeof ( int ) = 4
DEP
C99 stdint.h::intptr_t, uintptr_t
TIP
32bit ptr から u64 に変換する際は
上位に 1 bit がはいらないように uintptr_t に変換する
WARNING
ptr を Int 型に cast していると, 64 bit では 上位 bit がなくなる
// ERROR
// 0x80 00 00 00 が負の整数として扱われる
// 64 bit に 拡.張 されるとき 上位 bit に 1 がはいる
void *p = (void *)0x80000000;
uint64_t x = reinterpret_cast< uint64_t >(p);
// OK
// 上位に 1 bit が入るのを避ける
uint64_t x = reinterpret_cast< uintptr_t >( p );
VisualStudio では次のように定義
#ifdef _WIN64
typedef unsigned __int64 uintptr_t;
#else
typedef _W64 unsigned int uintptr_t;
#endif
■ __int64
DESC
C、C++における非標準の変数型で、64ビット長の整数を宣言する。
Microsoft C/C++やBorland C++Builder、その他の環境でこの変数型に対応している。
gcc は対応していない。
POINT
非標準の型であるので, Visual C++ 以外の環境では利用できない。
32bit 環境でも利用できる。64bit 環境ではレジスター1本ですむが、32bit環境では2本使う。
内部では32ビット×2で処理される。
__int64 num;
num = 0x1122334455667788i64;
_num$ = -8
mov DWORD PTR _num$[ebp], 1432778632
mov DWORD PTR _num$[ebp+4], 287454020
■ __int32
DESC
__int64 と同じく Visual C++ 固有の 32bit の整数型
■ wchar.wchar_t
ANSI C は標準でワイド文字をサポートしている
■ MultiByteCharacter.とは
英数字や一部の記号を 8bit ひらかな.漢字を 16 bit で表現
MS-DOS の時代から使われている Shift-JIS を使ったモ−ド
■ WideCharacter.とは
1文字表現するのに2バイト用いる文字のこと
なぜ Wide 文字ができたか ?
1 Byte だけでは中国語や日本語のような
漢字や記号を多く持つ言語を表せないから.
WideCharacter は国際的なアプリケーションの開発には必要な知識
UNICODE も WideChara のひとつ( 一例にすぎない )
ワイド文字の型は wchar_t であらわす // WCHAR.H
typedef unsigned short wchar_t; // 実体は unsigned short
ワイド文字型で文字列を表現してみましょう
ワイド文字として文字列を格納するには、文字列の前にL(Long)プレフィックスを指定する
wchar_t wc[] = L"test";
ワイド文字列は、必ず 1文字 2バイトの領域を確保する
VC で L"aiueo" とすると utf-16 で Encode される