8bit符号付整数(2の補数表現)における最大値と最小値は
いくらになるんでしょうか?(10進数で)

本当に初心者な問題ですみません。
2の補数表現、なにを意味する表現なのかさっぱりわかりません。
持ってる教科書を何度読み返してもわからなかったので質問しました。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>本当に初心者な問題ですみません。



教科書を読んでいると言う事は、初心者と言う事では無くて勉強している学生さんですよね。

>2の補数表現、なにを意味する表現なのかさっぱりわかりません。
>持ってる教科書を何度読み返してもわからなかったので質問しました。

アドバイスとしては、教科書にほとんどそっくりの事が絶対出ていますから、もう一度教科書を見て下さい。

ここが、自分の力でわからないないようであれば、学校に行っている意味が有りません。

授業で話されている事の全てがわかっていないと宣言しているようなレベルの質問ですよ。

もう一度、言います。
教科書を見て下さい。
    • good
    • 0

そのことが書いてないような教科書は捨てた方が良いと思う。



参考URL:http://software.nikkeibp.co.jp/software/special/ …
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Qn進数の値を10進数の値に変換するには?

こんにちは。

C言語において、n進数の値を10進数の値に変換する方法を考えています。
例えば、2進数の101を、10進数で表すと5になります。
これを関数化し、
n_to_m(int x, unsigned n); といったプロトタイプで、
渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。
逆に、10進数の値を、n進数の値に変換する関数も一緒に作りたいと考えています。
何かいい方法を思いついた方がいらっしゃれば、是非アドバイスを頂きたいと思います。
では、よろしくお願い致します。

Aベストアンサー

>n_to_m(int x, unsigned n); といったプロトタイプで、
>渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。

変換後の10進数を戻り値とする必要がありそうであるのと、
n_to_mという名前では何のことやらよくわからなそうなので、
こんなプロトタイプがいいのではないかと思います。

int toDecimal(int x, unsigned int n);

1)変換結果を格納する変数を0で初期化する。
2)変換元が0でない間、2-1)~2-3)を繰り返す。
2-1)変換元を10で割った剰余がn未満ならば、変換結果に加える。
2-2)変換元を10で割った剰余がn以上ならば、変換元の数値をn進数で表現できないため、
エラーとする。エラー時の戻り値をどうするかは考えてみてください。
2-3)変換元を10で割った商を、新たな変換元とする。
3)求めた変換結果を呼び出し元へ返す。

こんなところでしょうか。

Q一次元配列で表現された最小ヒープの値挿入

問題文:ヒープに新たなデータを挿入する関数insertを作成せよ。空の配列に複数回insertを行うことで
構成したヒープがヒープ条件を満たしていることをcheck_heapを用いることで確認せよ。プロトタイプ宣言は以下とする。
void insert(int val, int a[],int *n);

質問: 
複数回はおいといてとりあえず1回insertしようと思って書いたんですが、ヒープの最後に新しいノードを
作って親より小さければ親の値と交換を繰り返してヒープを完成させようとしてるんですが、1回しか交換されません。
どうすればいいですか?check_heapは最小ヒープ条件が満たされていれば1を満たされていなければ0を返す関数です。
自分のソース
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int check_heap(int a[], int n);
void insert(int val, int a[], int *n);


int main(void) {
int a[11] = {1,13,71,14,15,80,91,24,60,63};
int n;
int i;
int b,c;

srandom(time(NULL));
b = random() % 100 + 1;
n = 10;

insert(b, a, &n);


printf("%d\n", check_heap(a, 11));


for(i = 0; i < 11; i++){

printf("%3d", a[i]);


}




return 0;
}

int check_heap(int a[], int n) {
int i;
int m;
m = (n - 1) / 2;
for(i = 0; i < m; i++)
{
if(a[i] >= a[i * 2 + 1])
{
return 0;
}
if(a[i] >= a[i * 2 + 2]){
return 0;
}
}


if(n % 2 == 0){

if(a[(n - 1)/2] > a[n - 1]){

return 0;
}
}
return 1;

}

void insert(int val, int a[], int *n) {

int temp;


a[*n] = val;


while(a[(*n-1) / 2] >= a[*n]){
temp = a[(*n-1) / 2];
a[(*n-1) / 2] = a[*n];
a[*n] = temp;

}





}

問題文:ヒープに新たなデータを挿入する関数insertを作成せよ。空の配列に複数回insertを行うことで
構成したヒープがヒープ条件を満たしていることをcheck_heapを用いることで確認せよ。プロトタイプ宣言は以下とする。
void insert(int val, int a[],int *n);

質問: 
複数回はおいといてとりあえず1回insertしようと思って書いたんですが、ヒープの最後に新しいノードを
作って親より小さければ親の値と交換を繰り返してヒープを完成させようとしてるんですが、1回しか交換されません。
どうすればいいです...続きを読む

Aベストアンサー

> 1回しか交換されません。

この↓中で*nを更新していないから(while-loopが一回止まり)じゃないかしら。

void insert(int val, int a[], int *n)
 int temp;
 a[*n] = val;
 while(a[(*n-1) / 2] >= a[*n]){
  temp = a[(*n-1) / 2];
  a[(*n-1) / 2] = a[*n];
  a[*n] = temp;
 }
}

QC で、a、b、c が16ビット符号無し整数のとき

C で、a、b、c が16ビット符号無し整数のとき、

a = 0x7FFF * b / c;

の途中結果の 0x7FFF * b は 16ビット符号無し整数として処理されるのですか。32ビットで処理してくれたら便利なのですが。

Aベストアンサー

Cの規格は確認してませんが、普通のCコンパイラだと、1 とか 0x7FFF のような数字定数はint型です。
int型が32bitのコンパイラを使っていれば、全部32bitで計算されます。

Q大量のファイルを読み込み、その各ファイルの中の最大値と最小値の出力の仕方

各ファイルの名前はinput_0.txtからinput_4.txtまであるとします。これらのファイルには(1)ナンバー(2)身長(3)体重がスペースをはさんで入力されています。
例:input_0.txt
1 172.3 65.3
2 164.3 54.6
3 176.4 55.4
4 170.2 70.4
5 167.4 63.8

この例では3番目の176.4が最大値として認識し2番目の164.3を最小値として出力させたいのですが、うまくいきません。プログラムを以下のように作りました。どこがいけないでしょうか?ご教授の方よろしくお願いします。

FILE *fpr,*fpw;
int no[N],i,j,max_j,min_j;
char fname[30];
float height[N],weight[N],max=0,min=0;

for(i=0;i<4;i++)//file題名用ループ
{
sprintf(fname,"input_%d.txt",i);

if((fpr=fopen(fname,"r"))==NULL)
{puts("file open error!!");return 0;}

for(j=0;j<5;j++){//ファイル内容用ループ
while((fscanf(fpr,"%d%f%f",&no[j],&height[j],&weight[j]))!=EOF)


if(height[j]>max){
max=height[j];max_j=j;
printf("number=%d__height=%.2f__weight=%.2f\n",no[max_j],max,weight[max_j]);
}
if(height[j]<min){
min=height[j];min_j=j;}
printf("number=%d__height=%.2f__weight=%.2f\n",no[min_j],min,weight[min_j]);

fclose(fpr);

各ファイルの名前はinput_0.txtからinput_4.txtまであるとします。これらのファイルには(1)ナンバー(2)身長(3)体重がスペースをはさんで入力されています。
例:input_0.txt
1 172.3 65.3
2 164.3 54.6
3 176.4 55.4
4 170.2 70.4
5 167.4 63.8

この例では3番目の176.4が最大値として認識し2番目の164.3を最小値として出力させたいのですが、うまくいきません。プログラムを以下のように作りました。どこがいけないでしょうか?ご教授の方よろしくお願いします。

FILE *fpr,*fpw;
int no[N],i,j,ma...続きを読む

Aベストアンサー

うまくいかないとは、具体的にどういう結果になってしまうのかを
書いてくだされば原因を特定しやすいのですが……。

ざっと見て思ったのは以下のとおり。これで直ればよいのですが……。
○2つめのファイルを読み込むとき、たとえば一つ目のファイルの
 最大値が max に代入されたままです。
 ループの最初でmaxやその他の変数に初期値を代入しましょう。
○if(height[j]>max) と if(height[j]<min) の閉じ括弧の位置が違う。
○最大値や最小値を発見するたびに表示してしまっているので
 ファイル内容用ループのあとにprintfを移動する。
○fscanf(fpr,"%d %f %f",&no[j],&height[j],&weight[j])
 と、第二引数に半角スペースを空ける。

Qn進数を10進数に変換するプログラムがわかりません

整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム
関数void base2dec(int n, string digits, int &dec)を使用する

実行例 110101(2)=53
123(8)=83
7ACE(16)=31438
以下はとりあえずつくったみたプログラムです
#include<iostream>
#include<string>
using namespace std;
void base2dec(int n, string digits, int &dec)
{
int i,x=0;
for(i=0; i=digits.size()-1; i++)
{
if(n<10)
{
x=digits[i]-'0';
}
else
{
x=digits[i]-'A'+10;
}
dec=(x*n);
if(cin >> digits[i++])
{
if(n<10)
{
dec=dec+(digits[i++]-'0');
}
else
{
dec=dec+(digits[i++]-'A'+10);
}
}
}
int value = dec;
}

int main()
{
int n,value;
string digits;
cout << "何進数ですか-->";
cin >>n;
cout << "数字列を入力してください-->";
cin >>digits;;
base2dec(n,digits,value);
cout << digits << "(" << n << ")=" << value << endl;
return 0;
}

void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。ちなみにn進数から10進数に直す方法は理解しています。

整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム
関数void base2dec(int n, string digits, int &dec)を使用する

実行例 110101(2)=53
123(8)=83
7ACE(16)=31438
以下はとりあえずつくったみたプログラムです
#include<iostream>
#include<string>
using namespace std;
void base2dec(int n, string digits, int &dec)
{
int i,x=0;
for(i=0; i=digits.size()-1; i++)
{
if(n<10)
{
x=digits[i]-'0';
}
else
{
...続きを読む

Aベストアンサー

★アドバイス
>for(i=0; i=digits.size()-1; i++){
 ↑
 この行がおかしいです。
 間違い⇒for(i=0; i=digits.size()-1; i++){
 正しい1⇒for(i=0; i<=digits.size()-1; i++){
 正しい2⇒for(i=0; i<digits.size(); i++){
 ※回答者 No.1 さんのアドバイス通りです。
>void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。
 ↑
 『dec=(x*n);』ここが違う気がします。
 『dec=(dec*n+x);』とすればいいと思いますけど。
>ちなみにn進数から10進数に直す方法は理解しています。
 ↑
 理解しているのなら『dec=(dec*n+x);』となると思いますが…。

その他:
>if(cin >> digits[i++]){ … }
 ↑
 このifブロック内は必要なのか?
 どういう意味。
>int value = dec;
 ↑
 最後のこの行は意味ないね。
 『value』を参照してないし。
 戻してないし。
 そもそも dec が『参照』ですよ。
 http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node8.html→『ポインタと参照』
 このリンクを読みましょう。
・以上。あと16進などのA~Fは大文字専用ですね。小文字だと上手く変換できませんよ。

参考URL:http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node8.html

★アドバイス
>for(i=0; i=digits.size()-1; i++){
 ↑
 この行がおかしいです。
 間違い⇒for(i=0; i=digits.size()-1; i++){
 正しい1⇒for(i=0; i<=digits.size()-1; i++){
 正しい2⇒for(i=0; i<digits.size(); i++){
 ※回答者 No.1 さんのアドバイス通りです。
>void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。
 ↑
 『dec=(x*n);』ここが違う気がします。
 『dec=(dec*n+x);』とすればいいと思いますけど。
>ちなみにn進数から10進数に直す方法...続きを読む


人気Q&Aランキング

おすすめ情報