• ベストアンサー

16進数のマスク処理

C#勉強中です。 以下のようなコードを書いてコンパイルをかけたところ、「型 'uint' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) 」と出ました。この理由がわかりません。 0xFFFF00FFはなぜ符合なしとなってunsigned扱いになるのでしょうか。 [Code] int ret = 0; ret &= 0xFFFF00FF;

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

0xFFFF00FFは、10進数で4,294,902,015という大きな数値の16進数表現であり、 int型で表現できる-2,147,483,648 ~ 2,147,483,647の範囲外だからです。 uintの0xFFFF00FFと同じビットパターンが格納されるint型の値は -0x0000FF01(=-65281)ですが、数値ではなくビットパターンを表現したい のであれば、uint型を使用すべきです。 ちなみに、C#と異なりC言語は、このあたりの型のチェックが緩いため int ret = 0xFFFF00FF; でも int ret = 4294902015; エラーにならず retの中に0xFFFF00FFというビットパターンを代入できます。 これは一見便利そうですが、本来格納できない場所に平気で格納できる仕様 (上記の例で言うと符号ビットの部分を都合で勝手に使う仕様) は、メモリ破壊に繋がる諸刃の剣でもあります。 このため、最近の言語は安全性に配慮してメモリ破壊に繋がる仕様を 極力排除するのが主流です。

miniminic555
質問者

お礼

ご回答ありがとうございます。 intで表現できる範囲を超えている、というところに納得しました。 また、たしかに数値自体を使うのではなく、ビットパタンとして使うのであればuintであるべきですね。 解説ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.3

>ご回答ありがとうございます。どうやらそのようですね。C#だとはねられるようです。 はねられるとかではなく 0x8000000~0xffffffff は、UInt32扱いになってるだけです。 理由は#2の方が書かれているようにInt32の範囲外だから。

miniminic555
質問者

お礼

コメントありがとうございます。 すみません、はねられるという表現は間違っていますね。ご指摘ありがとうございます。範囲外だから、というのが理由ですね。

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

確認はしていませんがC#の仕様でそうなってるのでは?

miniminic555
質問者

お礼

ご回答ありがとうございます。どうやらそのようですね。C#だとはねられるようです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 暗黙的型変換

    C の文法書を読んでいると、 汎整数型拡張: int より小さな汎整数型が式中に現れる場合は、暗黙的に int 型に変換される。 算術変換: 二項演算子で二つのオペランドの型が違う場合は、演算前により大きな方の型に暗黙的に変換される。 とあります。 例えば int 型 = unsigned short 型 - unsigned char 型; はどのように暗黙的な型変換が行われるのでしょう。 int 型 = (int)unsigned short 型 - (int)unsigned char 型; でしょうか。あるいは、 int 型 = (int) ( unsigned short 型 - (unsigned short)unsigned char 型); でしょうか。

  • C#で型変換がうまくいきません。

    C#で型変換がうまくいきません。 short r; byte[] b = new byte[] {1,2,3}; r = (short)b[1] * (short)256; というコードを書くと、 型 'int' を 'short' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) と出てしまいます。キャストしているのに何がいけないのか全くわかりません。 どうぞ宜しくお願いいたします。

  • Java intの扱い

    こんにちは、Javaを勉強しているものです。 小さなデータ(byteなど)をより大きないれもの(intなど)に入れるときには、暗黙的なキャストがおこなわれます。 逆に、大きな値を小さないれものに入れるための変換を「縮小変換」と呼び、これには明示的なキャストが必要だと習いました。 そこで、次のようなコードがあった場合、これは明示的なキャストが必要なのではないのでしょうか? byte b = 3; これは、コンパイルエラーにはならないのですが、 3はint型であり、bはbyte型なので、大きな値を小さな小さないれものに入れているということになります。本来であれば byte b = (byte)3; と書くべきではないのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java
  • C言語の関数の質問です

    C言語の質問です 最近C言語を始めました。以下の問題がわかりません。 int型の数値を入力して結果をdouble型の戻り値を返すことはできないのか。 関数の値のやり取りでも暗黙の型変換や明示的な型変換はできるのか。 #include <stdio.h> double square(int x); int main(void) { int num;   double ret;   scanf("%d",num); ret = square(num);    printf("%ld",ret); return(0); } double square(int x){ return(x*x); }

  • SDKでのエラーなのですが。

    はじめまして。 SDKの勉強で猫でもわかる~のHPの第37章のサンプルを実行したのですが、 --------------------構成: 037 - Win32 Debug-------------------- コンパイル中... main.cpp D:\SDK\037\main.cpp(230) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 D:\SDK\037\main.cpp(248) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー 037.exe - エラー 2、警告 0 というようなエラーが出てしまいました。 このエラーを回避するにはどのようにすればいいのでしょうか?

  • 汎整数拡張の通常の算術型変換

    「汎整数拡張」の「通常の算術型変換」に <一方のオペランドが型unsigned long intをもつ場合、他方のオペランドをunsigned long intに型変換する。> この下に「そうでない場合」が、一方のオペランドが型long intをもつ場合が二つ続きます。 <一方のオペランドが型unsigned intをもつ場合、他方のオペランドをunsigned intに型変換する。> <>2つの例はlong型やint型よりもunsigned型の上位に位置づけています。 例として   if(-1<1u)は偽になります。 何ゆえにunsigned型の上位性をしているのでしょうか。宜しく願います。

  • C言語:アウトプット引数のキャストについて

    以下のサンプルソースのように、(1)の場合、出力結果が24にならないのはなぜでしょうか?基礎的な質問だと思いますがよろしくお願いします。 --------------------------------------- サンプルソース #include <stdio.h> int getValue(unsigned short* us){ *us = 24; } main(){ int ret = 0; int intVal = 0; unsigned short usVal = 0; /* (1)int型のintValをunsigned short型にキャストした場合 */ ret = getValue((unsigned short*)&intVal); printf("%d\n", intVal); /* (2)unsigned short型のusValをそのまま引数に渡した場合 */ ret = getValue(&usVal); printf("%d\n", usVal); } ---------------------------------- 出力結果 1572864 ←(1)の結果 24 ←(2)の結果 -----------------------------------

  • プッシュボタンができなくなってる

    LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) ・・・・・・ hCtrlBx[0]= CreateWindow("BUTTON","ok",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, i_cw,2*i_ch,8*i_cw,2*i_ch,hW,2,((LPCREATESTRUCT)lP)->hInstance,NULL); によってプッシュボタンを作ろうとしたのですが エラー E2034 ok.cpp 134: 'int' 型は 'HMENU__ *' 型に変換できない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) エラー E2342 ok.cpp 134: パラメータ 'hMenu' は HMENU__ * 型として定義されているので int は渡せない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) となり作れませんでした hWの後の2が0のときはokですが1以上のときはoutです 以前はできたやり方なのにどうしたのでしょう 対処の仕方を教えてください

  • C言語のキャストについて

    お世話になります。 CRC-16の計算プログラムをC言語でつくりました。 例えば・・・1F 08 00 00 12 34 なら“1F0800001234”と入力すると【EEC2】と表示するプログラムです。 ただ・・・.Net SDKでコンパイルするとできたのですが、Visual C++2008でコンパイルするとエラーが出てしまいます。 (48) : error C2664: 'strlen' : 1 番目の引数を 'unsigned char [256]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 (52) : error C2664: 'strtol' : 1 番目の引数を 'unsigned char [3]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 型変換が必要ってことまではわかったのですが・・・必要なのはわかって行き詰まり状態です。。。 どのようしたらよいのでしょうか?ご教授をよろしくお願いします。 ソースは以下の通りです。 #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; t= 0x0000; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; t = (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } int main(void) { unsigned char str[256],data[128],hexstr[3]; unsigned short crc,CRC,len; while(1) { printf("Please input key (HEX)\n"); scanf("%255s",str); hexstr[2]='\0'; for(len=0; len<(strlen(str)/2) ;len++) { hexstr[0]=str[len*2]; hexstr[1]=str[len*2+1]; data[len]=(unsigned char)strtol(hexstr, NULL, 16); } crc = crc_cal(len,data); CRC = (crc>>8) | (crc<<8); printf("\nCRC16 = %04X\n\n", CRC); } return 0; }

  • #defineでの型定義について

    typedefと同様に#defineでも型定義できると聞いて行いましたがコンパイルエラーが出てうまくいきませんでした。どうすればいいでしょうか? typedef unsigned int Unit //OK #deifine Unit unsigned int //NG