12

C ++テストを行っていたところ、次の質問が間違っていました。

Q:次のプログラムの出力は何ですか?

#include <iostream>
#include <stdint.h>

using namespace std;

int main() {
    int a = 0;
    for (int8_t i = 1; i > 0; i <<= 1)
        a++;
    cout << a;
    return 0;
}

から選択する次の答えがありました

  • 8
  • 7
  • 未定義動作
  • コンパイルエラー

正解」は7でした。回答に「実装定義の動作」が含まれている場合はそれを選択するので、最も近い未定義動作を選択しました。サインアンドマグニチュードでは、1の補数、2の補数の答えは7になることを理解しています。しかし、C ++標準では、理論的に他の数値表現は許可されていませんか?たとえば、符号と大きさですが、0は負を意味しますか?

この質問に対する本当の正解は実装定義の動作である必要があるという点で私は正しいですか。そうでない場合は、実装に関係なく答えが7である理由を説明してください。

質問へのコメントを読んだところ、最初aはcharのタイプで、署名されているかどうかについて多くの不満がchar出ていたようです。そのため、テストセッターはそれをint8_tに変更しました。ボーナスの質問として、<stdint.h>C ++の一部ですか?O_O

4

3 に答える 3

18

別の理由で、未定義(実装定義ではない)だと思います。

5.8:3から

の値は、E1 << E2E1左シフトE2ビット位置です。空のビットはゼロで埋められます。E1に符号なしタイプがある場合、結果の値はE1×2 E2 であり、結果タイプで表現可能な最大値より1を法として減少します。それ以外の場合、E1に符号付きタイプと非負の値があり、E1×2 E2が結果タイプで表現可能である場合、それが結果の値になります。それ以外の場合、動作は未定義です。

于 2013-03-24T10:28:51.687 に答える
7

実装がオプションを提供する場合、 C++11がstdintに関して参照するC99ドラフトint8_tからの答えは正しいはずです。

7.18.1.1正確な幅の整数型

typedef名intN_tは、幅N、パディングビットなし、2の補数表現の符号付き整数型を指定します。したがって、int8_tは、正確に8ビットの幅を持つ符号付き整数型を示します。

于 2013-03-24T10:21:11.627 に答える
3

直接の質問に答えたので、私はボーナスの質問に答えます:<stdint.h>C++で利用可能なCヘッダーです。<cstdint>ただし、代わりに最新のC++ヘッダーを使用してください。

于 2013-03-24T11:34:14.117 に答える