• 締切済み

int→unsigned int キャスト

int test01; unsigned test02; の場合、test02にtest01の値を代入したい場合どうすればよいでしょうか? 型は変更できません。 キャストして代入しても大丈夫でしょうか?

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

値が負の場合、元の値が保持されるわけはありませんが、単に代入するだけであれば... test02 = test1; で大丈夫です。 負の場合は2の補数が入ります(符号付き整数の内部表現が1の補数や符号ビットと絶対値であったとしても)。

  • semisemi
  • ベストアンサー率72% (8/11)
回答No.2

intが何バイトの環境かわかりませんが、 32bitの環境なら、 int型が -2147483648~2147483647 unsigned int型が 0~4294967295 だと思います。 なので、No1のTacosanさんの仰るよおに、 test01 >= 0 なら、なんの問題もなく代入できます。 例: test02 = test01 問題は、test01 < 0 だった場合です。 unsigned int型は当然ですが負の値を扱えないので、何らかの条件分岐をしてやる必要があります。 if (test01 < 0) { //test01が負なので、何らかの対応処理をする。例えば↓ test02 = 0; } else { //test01が正 test02 = test01; } みたいな。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

0以上の値であることが分かっているならキャストすら不要. 負の値が入っているとしたら, 何を期待しているのか全く不明なので「大丈夫でしょうか? 」と聞かれても答えようがない.

関連するQ&A

  • C# int→byte のキャスト

    プログラミング初心者です。 int型の変数に255以上の値を代入し、byte型の変数にcastするとbyte型の変数に代入される値はint変数の値から256を引いた値になります。なぜですか、またどういう仕組みでcastは行われるんですか?

  • unsigned int型について

    C言語初心者です。 unsigned int型に関する質問です。 --------------------------------- #include <stdio.h> int main(void) { unsigned int in1 = 10; unsigned int in2 = -10; unsigned char ch1 = 10; unsigned char ch2 = -10; printf("in1 = %d\n", i); printf("in2 = %d\n", i); printf("ch1 = %d\n", ch1); printf("ch2 = %d\n", ch2); return 0; } --------------------------------- 上記のプログラムを作成して実行すると、結果は以下の通りです。 [実行結果] in1 = 10; in2 = -10; ch1 = 10; ch2 = 246; 変数in2の値を表示した結果に関してですが、 unsigned int型にも関わらず負の値「-10」が表示されるのは 何故でしょうか?

  • unsigned int型と int型の型変換の上位性

    if(-10<1u)の条件判定はunsigned型で評価され偽となります。 int型 unsigned int型とも32ビットで考えたとき、 1u = 0x00000001 -10 = 0xfffffff6で10進法では4294967286になります。 条件判定をunsigned型で考えれば確かに-10<1uは偽になり int型で考えれば-10<1uは真になります。 「通常の算術変換」によれば、「一方のオペランドがunsigned int型をもつ時、他のオペランドをunsigned int型に型変換するとあります。」 よって、if(-10<1u)の条件判定はunsigned型で評価され偽となりますが、 「一方のオペランドがint型をもつ時、他のオペランドをint型に型変換する。」では何故いけないのでしょうか? 宜しく願います。

  • 文字列をint型にキャスト

    文字列をunsigned int型キャストし,それをある演算をして 正の整数に変換したいのですがどうすればいいですか? int ca(char *s) { unsigned int h; int key; h = (unsigned int)s; //文字列を演算し 0~254 の整数にする// key = h % 254; return key; } int main() { char moji[32]; moji = "moji"; unsigned int c; c = ca(moji); }

  • doubleからintへのキャスト

    場合によって値が変わってしまいます。 これはいったいどういうことでしょうか?? 開発環境はWindows2000 VC++6.0 実行環境はWindows98です。 Windows2000で実行した場合は値は一緒なのですが Windows98の場合は値が変わってしまいます。 Windows98で下のプログラムを実行すると int test1; double test2; ・ ・ ・ test1 = (int)test2 char mes[1024]; printf(mes, "%lf, %d", test2, test1); test2は100.000000 そしてtest1が100となります。 しかし、プログラム実行中にプログラムメニューの[印刷]等、Windowsのメニューを使うと test2は100.000000なのですが test1が99になってしまいます。 これはいったいどういうことなのでしょうか。 値が減ることなんてありえるのでしょうか? よろしくお願いします。

  • unsigned *という宣言について

    char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef"; unsigned *u = (unsigned *)(str + 1); このようなコードをみかけたのですが、 unsigned *uという宣言が理解できません。 これはどのような型として解釈されているのでしょうか? 暗黙でunsigned int* uと解釈されるのでしょうか?

  • キャスト演算子について

    初心者の初歩的な質問ですが、変数の型を変換するキャスト演算子がありますが本を読んでいて思ったのですが変換した式の型はその後どうなるのでしょう? 例で(前略) ----------------------------   int A =0; /*A=0*/ double B =2; /*B=2.000000*/ A = (int)B; B = 3; ----------------------------- とするとA=2 となりますがこの時のBの型はどうなるのでしょう? キャストを使用すると最初に宣言したdoubleがintになってしまうのか?後で代入した3は最初に宣言したdouble型の「3.000000」?それとも変換したint型「3」? 多分最初のままのような気はしますが。よろしくお願いします。

  • double型からint型へのキャストについて

    お世話になります。 掲題の疑問がわきましたので質問させてください。 Ex1. int a = 100; a /= 1.05; Ex2 int a = 100; a = 100 / 1.05; この場合、Ex1は問題なく、Ex2でエラーが発生します。 Ex2でdouble型からint型へキャストできないということは納得できるのですが、逆になぜEx1が問題なく行えるのでしょうか、、 よろしくお願い致します。

  • 64bit → 32bit型へのキャスト

    long 64data = 1; int 32data = (int)64data; 64bitの変数で上位32bitは使わない場合、int型の変数にキャストして代入することは可能ですか?

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

専門家に質問してみよう