- ベストアンサー
16進数のマスク処理
C#勉強中です。 以下のようなコードを書いてコンパイルをかけたところ、「型 'uint' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) 」と出ました。この理由がわかりません。 0xFFFF00FFはなぜ符合なしとなってunsigned扱いになるのでしょうか。 [Code] int ret = 0; ret &= 0xFFFF00FF;
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関連する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++・C#
- C#で型変換がうまくいきません。
C#で型変換がうまくいきません。 short r; byte[] b = new byte[] {1,2,3}; r = (short)b[1] * (short)256; というコードを書くと、 型 'int' を 'short' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) と出てしまいます。キャストしているのに何がいけないのか全くわかりません。 どうぞ宜しくお願いいたします。
- ベストアンサー
- C・C++・C#
- 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); }
- ベストアンサー
- C・C++・C#
- 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 というようなエラーが出てしまいました。 このエラーを回避するにはどのようにすればいいのでしょうか?
- ベストアンサー
- C・C++・C#
- 汎整数拡張の通常の算術型変換
「汎整数拡張」の「通常の算術型変換」に <一方のオペランドが型unsigned long intをもつ場合、他方のオペランドをunsigned long intに型変換する。> この下に「そうでない場合」が、一方のオペランドが型long intをもつ場合が二つ続きます。 <一方のオペランドが型unsigned intをもつ場合、他方のオペランドをunsigned intに型変換する。> <>2つの例はlong型やint型よりもunsigned型の上位に位置づけています。 例として if(-1<1u)は偽になります。 何ゆえにunsigned型の上位性をしているのでしょうか。宜しく願います。
- ベストアンサー
- C・C++・C#
- 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)の結果 -----------------------------------
- ベストアンサー
- C・C++・C#
- プッシュボタンができなくなってる
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・C++・C#
- 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; }
- ベストアンサー
- C・C++・C#
- #defineでの型定義について
typedefと同様に#defineでも型定義できると聞いて行いましたがコンパイルエラーが出てうまくいきませんでした。どうすればいいでしょうか? typedef unsigned int Unit //OK #deifine Unit unsigned int //NG
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます。 intで表現できる範囲を超えている、というところに納得しました。 また、たしかに数値自体を使うのではなく、ビットパタンとして使うのであればuintであるべきですね。 解説ありがとうございました。