2016-04-27 17 views
0

私はC++で作業していますが、私は(演習として)ペーパー2の回答に書いていました。 最初の質問:私たちは、次の変数の宣言とinitialisationsを持っている場合:a + bとchar型の値

unsigned char x=250, z=x+7, a='8'; 

式の値は何ですか?

z|(a-'0') // (here | is bitwise disjunction) 

z=x+7がMOD 256に減少されるように我々はこのように、バイナリで数字を書いた後、答えは9


次の質問で、unsigned char型があります。aとbがありますint変数、a=1およびb=32767

intの範囲は[-32768, 32767]です。ここでは符号なしタイプはありません。私の質問です:a+bの値は何ですか?特定の変数の値がそのデータ型の範囲よりも大きい場合、これは符号付きデータ型でどのように機能しますか?

+4

a + bの値は何であると思いますか? –

+0

-32768これは実際にどのように動作しているのか見たいと思っています。 – shibuya

+0

"ここに|ビット単位の論理和"です - はい、わかっています – harold

答えて

3

次の質問:a、bが、a=1b=32767 int型変数です。

[...]私の質問です:a+bの値は何ですか?

undefined behavior。私たちはそれが何であるかあなたに伝えません。私たちは妥当な推測をすることができますが、C++が符号付き整数オーバフローに関することは未定義の動作です。

+0

未定義の動作または実装が定義されていますか?私はここに記載されている違いを意味します:http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior – PiotrNycz

+0

@PiotrNycz未定義の動作です:http://stackoverflow.com/a/16188846/ 4342498 – NathanOliver

+0

答えをありがとう! – shibuya

1

は、それが最初intにこれらunsigned charの引数を促進するだけにして式の型がintになるように、追加を行い、C++にはoperator+(unsigned char, unsigned char)はありません。

そして、その値が大きすぎてunsigned charに収まらないほど大きくなった場合、unsigned charに変換されます。

標準は言う:

整数型のprvalueが別の整数型のprvalueに変換することができます。スコープのない列挙型の正値は、整数型の正値に変換できます。宛先タイプが符号なしの場合、結果の値はソース 整数(モジュロ2 ** n、nは符号なしタイプを表すために使用されるビットの数)に一致する最小の符号なし整数です。 [注:2の補数表現では、この変換は概念的であり、ビットパターンに変更はありません(切り捨てがない場合)。 - エンドノート]

+0

@KerrekSBあなたは正しいです、見積もりを追加しました。 –

0

2番目の質問では、答えは不定です。

あなた自身はこのようにそれを確認することができます。

#include <iostream> 

using namespace std; 

int main() 
{ 
    int a = 1; 
    int b = 32767; 
    int c = a+b; 
    cout << c << endl; 
} 

結果は、マシンに依存します。

+0

'int 'の範囲は[-32768,32767]です。 –

+0

* 2番目の質問の答えは確かに-32768 *あなたのマシンとOPマシンにあるかもしれませんが、C++ではUBです。あなたはそれがいつもそうであると言うことはできません-32768 – NathanOliver

+0

あなたは正しく、私の悪いです。 –

関連する問題