• 締切済み

unsigned long 型の32bit 

unsigned long testData = 1; testData = (testData << 32); 上記のような64bitのデータを32bit左シフトすると gccで警告がでます。 warning : left shift count = width of type sizeof(unsigned long) は8となっており、64bitなので、 32ビット左シフト演算は問題がないように思いますが、 なにが問題なのでしょうか?

みんなの回答

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

とりあえず ・gcc を動かしている環境 (と gcc -v の結果) ・(その警告が出ることはとりあえずおいておいて) コンパイルできる完全なプログラム は出せますか?

関連するQ&A

  • c++でunsigned long long intを用いるには

    OS(ディストリビューション)はubuntuです。 この質問の目標は表題のように 「c++でunsigned long long intを使えるようにすること」 です。なお、マシンは32bitなので64bitよりは遅くなります。 http://www.wdic.org/w/TECH/long%20long まずgccのバージョンは、gcc --versionによると、 gcc (GCC) 3.3.5 (Debian 1:3.3.5-8ubuntu2.1) でした。そこで、gccのバージョンを3.4.4以上に しようと考えました。 (↓の人は3.4.4でできているらしい。 http://qune.cside.com/archives/000959.html) そこで、 http://webos-goodies.jp/archives/50899271.html にそってgccをアップデートしようとしましたが、 /etc/portage/ というディレクトリはありませんでした。次に、 http://www.gentoo.org/doc/ja/gcc-upgrading.xml にそってgccをアップデートしようとしましたが、 emergeというコマンドは入っていませんでした。 さて、質問は以下の通りです。 1.「目標」を達成するのにこのルートはあっているのでしょうか? 2.あっているのなら、emergeのインストール法を教えてください。 3.あっていないなら、どのようにしたら「目標」を達成できるでしょうか?

  • long doubleの有効桁数を教えてください。

    long doubleの有効桁数を教えてください。 環境で一概に言えないと思いますが、 私の環境では、sizeof(long double)で12バイトです。 OS Windows Vista(32bit) GCC minGW よろしくお願いします。

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • C++で、b[bit]の非負整数(例えば、unsigned long)

    C++で、b[bit]の非負整数(例えば、unsigned long)2つa0,a1を用いて、2b[bit]の非負整数を表現した場合の除算に関する質問です。 非負整数 a=a0*2^b+a0 を b[bit]の非負整数 D(≠0) で割った、商と余りを求めたいのですが、例えば次のように求めようとします、 d0 = a0/D. m0 = a0%D. d1 = (m0*2^b+a1)/D = (m0*2^b)/D + a1/D m1 = (m0*2^b+a1)%D = (m0*2^b)%D + a1%D ですが、ここで (m0*2^b)/D と (m0*2^b)%D をb[bit]の非負整数に対する演算のみ(ループ処理も含めたくない)を用いて計算する方法が思いつかないのですが、何か良い方法はありませんでしょうか? 上記が計算できれば、 商 d = d0*2^b + d1. 余り m = m1 と構成できます。

  • sizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

      数値(整数)型の定義サイズについて、質問です。 ANSIの規格では、 sizeof(short) ≦ sizeof(int) ≦ sizeof(long) としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。 しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、 sizeof(short) → 2 sizeof(int) → 2 sizeof(long) → 4 となっているようです。(手元にないので、gccでは確認していませんが・・・) 実際のところ、上記のサイズにならない処理系は実在するのでしょうか? 何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に > 次の sizeof 演算子の返す値として正しいものはどれですか。 > > long hoge[32]; > sizeof(hoge); > ------------------------------------------------------ > A. 32 > B. 64 > C. 128 > D. 256 > E. 512 という問題が掲載されており、解説が、 > 正解は C 。 > > long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。 となっていたのです。(short型のサイズを問う類題あり) 特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。 sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか? コメントをお待ちしております。  

  • intとlongは同じ?

    #include <stdio.h> #include <limits.h> int main() { printf("%d\n%d", INT_MAX, LONG_MAX); return 0; } 出力 214783647 214783647 Win7 64bit (VC++2010) CentOS 32bit (gcc) どちらの環境でも同じ出力結果となりました。 intとlongなぜ同じになってしまったのでしょうか。

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • シフト演算の結果の型

    シフト演算の結果の型は、左オペランドの型ということを聞きました。 この左オペランドの型というのは算術型変換をしてからのか、する前の型なのかどちらなのでしょうか? 例えば int a = -2; unsigned int b = 1; a >> b このときの結果の型は何になるのでしょうか? 算術型変換が起きる前のintになるのか? それとも算術型変換が起きるた後のunsigned intになるのか? 例文としてはおかしい点もあるかもしれませんが よろしくお願いします。

  • 偶数パリティ

    引数で渡されたデータの最上位ビット偶数パリティを付加する以下の関数について、空欄(1)~(3)に入る値または式について、考えているのですが、どうしても分かりません。自分なりに出した回答について、ご指摘や解説をいただければと思います。 void AddParity(unsigned int :src) { int bit; int cnt; int i; bit = sizeof(int) : { (1) }; for (i = 0, cnt = 0;{ (2) }; i++){ if (*src & (1 << i)) cnt++; } if (cnt & 1) *src |= 1 << (bit -1); else *src{ (3) } ~(1 << (bit -1)); } (1)について 変数「bit」の初期値設定ですが、sizeof関数に何を乗じるのか分かりません。 (2)について for文の条件についてですが、「cnt < ??」 だとは思うんですが、??が分かりません。 (3)について シフト演算で、偶数パリティを付加する処理だろうとは思うんですが、 何が入るのか分かりません・・・

  • 1bppファイルを8bpp(raw)に変換する。

    環境 Windows7 VS2008 SP1 1bppの画像を8bppに変換しようとしているのですが うまくいきません。自分ではこれで 合っていると思うのですが・・・ 何かアドバイスお願いしますm(__)m int Main1bppTo8bpp(WCHAR *filename,int width,int height) { //width,heightは8bppになったときの幅,高さを指定する。 FILE *fpt; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK); return -1; } else { unsigned char *layer,*Output; layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char)); Output=(unsigned char*)malloc(width*height); //読み込み fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt); FILE *fpt_output; _wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb"); int i,j,flag=0x00; for(i=0;i<((width/8)+1)*height;i+=((width/8)+1)) { for(j=0;j<((width/8)+1);j++) { //8bit目 if((layer[i+j]&BIT8)==BIT8) { Output[i+j+flag]=0x00; } else { Output[i+j+flag]=0xff; } //7bit目 if((layer[i+j]&BIT7)==BIT7) { Output[i+j+flag+1]=0x00; } else { Output[i+j+flag+1]=0xff; } //6bit目 if((layer[i+j]&BIT6)==BIT6) { Output[i+j+flag+2]=0x00; } else { Output[i+j+flag+2]=0xff; } //5bit目 if((layer[i+j]&BIT5)==BIT5) { Output[i+j+flag+3]=0x00; } else { Output[i+j+flag+3]=0xff; } //4bit目 if((layer[i+j]&BIT4)==BIT4) { Output[i+j+flag+4]=0x00; } else { Output[i+j+flag+4]=0xff; } //3bit目 if((layer[i+j]&BIT3)==BIT3) { Output[i+j+flag+5]=0x00; } else { Output[i+j+flag+5]=0xff; } //2bit目 if((layer[i+j]&BIT2)==BIT2) { Output[i+j+flag+6]=0x00; } else { Output[i+j+flag+6]=0xff; } //1bit目 if((layer[i+j]&BIT1)==BIT1) { Output[i+j+flag+7]=0x00; } else { Output[i+j+flag+7]=0xff; } flag=flag+8; } flag=0x00; } //最終的な「fwrite」はここでする。 fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output); free(layer); free(Output); fclose(fpt); fclose(fpt_output); } return 0;

専門家に質問してみよう