プロが教える店舗&オフィスのセキュリティ対策術

どうしてですか?
unsigned int は6万しか取れなくて
16^6は1千万を超えてしまいます

A 回答 (1件)

それは、具体的にどのCPU向けのなんというCコンパイラの話でしょうか?


また

#include <stdio.h>
#include <limits.h>
int main(){
int s = sizeof(unsigned int);
printf("sizeof(unsigned int)=%d\n",s);
printf("UINT_MAX=%u\n",UINT_MAX);
return 0;
}

このプログラムを実行したらどんな出力になりますか?
(標準ライブラリが使えるコンパイラで、printfでの出力ができたとして)


intの大きさは、対象CPUやコンパイラの種類によって違います。
例えば、Windows PC用のVisual C++だと intは32ビットで、次のように出力されるはずです。
sizeof(unsigned int)=4
UINT_MAX=4294967295


> unsigned int は6万しか取れなくて

「6万」という「中途半端」な値ということは、まずありません。
普通は内部では二進数が使われているので、intが16ビットのコンパイラだと 65535が最大になります。
このとき、上記のプログラムでは 「sizeof(unsigned int)=2」「UINT_MAX=65535」 と出力されると思います。
※ sizeof(unsigned int)= の方は違う値になるケースもありますが。

「6万しか取れなくて」等と言われると、この情報自体が間違っているのでは?と疑ってしまいます。


> unsigned int に0xffffffを代入

まず。
整数型間では、「暗黙の型変換」が行われます。
unsigned int u; とした場合、
u=0xffffff ;

u=(unsigned int)0xffffff ;
と同じ意味になります。

大きな型から小さな型(int→char等)の場合、上位ビットの足りない分は無視されて下位だけが残ります。
例えば、char c; の場合 c=0x1234; は、下位の 0x34 だけがcに代入されます。(charが8ビットの場合)


intが16ビットというのが正しければ、 「u=0xffffff ;」と書くことは可能ですが、実際には上位ビットが捨てられて「u=0xffff ;」となります。
intが16ビットというのが間違っていて、24ビット以上(UMAX_INTが16777215以上)ならば、0xffffff が正しく代入できます。
    • good
    • 0
この回答へのお礼

ありがとうございます(_ _;)
charは1バイト
intは2バイトと勘違いしていました
unsignedintは符号なしの4バイトですね

感謝します。


関数電卓で2^32をやってみた結果4294967296になりました。
ネットで調べると4294967295でした
1誤差がありましたどうしてでしょうか?

お礼日時:2016/01/07 07:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A