2010-11-28 6 views
0

私はMSVC2005とQTで7 64ビットをウィンドウを使用しています(私はこれは基本的なデータ型charの問題ですので、QTが問題を引き起こしている疑い。Weired char型の行動++/MSVC2005/Windows 7の64ビット

だから私はそう

char A=0xAA; 

if(A==0xAA) 
printf("Success"); 
else 
printf("Fail"); 

loのように二つのcharさんを比較し、それが失敗した見張るしようとする!しかし、私はそれについて考えたとき、私はこの

char A=0xAA; 
char B=0xAA; 

if(A==B) 
printf("Success"); 
else 
printf("Fail"); 

が、私は実際に!成功を得るないとき...ちょっと私は働いているnは64ビットプロセッサです。charは1バイトとして扱われるはずですが。おそらく4バイトとして格納されています。 だから、

char A=0xAA; 

if(A==0xFFFFFFAA) 
printf("Success"); 
else 
printf("Fail"); 

今、私は成功を得ます!

しかし、WTF!この標準的な動作です!気になるものがcharとして定義されている場合、コンパイラはそれをどうしたらいいのか知ってはいけませんか?さらなるテストでは、charの最上位ビットが1の場合にのみ、余分なバイトが1つとして格納されることがわかります。したがって、0x07以下は0x00000007として格納されます。 WTF。

実際に私はすべての質問に答えているようでした...誰がこのバグを修正するために電話するかを除いて。これはバグですか? MSVC2005は64ビットオペレーティングシステムで正しく使用できますか、私は馬鹿です。私はMSVC2010を使用するためにQtクリエイターを得るべきだと思う。 2時間はかかります。

答えて

6

(符号付き)charと値-86(256-0xAA)を値170(0xAA)の整数と比較しています。

これは、32ビットシステムと8ビットシステムで同じことが起こります。

+0

1の切り捨てコンパイラの警告は、このコードが正しくない可能性があることを示しています。これは64ビットとは関係ありません。 Charは、32ビットと64ビットの両方のWindows上の1バイトです。 –

+0

'if(A ==((char)0xAA))'または 'if(A == '\ xAA')'を試してください – Steve314

+0

私が致命的な欠陥を仮定していたと思います。コンパイラは、値を符号なしとして割り当てることを自動的に認識します。ブラスト! – umps

2

64ビットとは関係ありません。正しい動作を得るには、Aをunsigned charとして定義する必要があります。

警告C4309:「初期化」:定数値

関連する問題