CHAR_MAXにchar値のセットがCHAR_MINにラップアラウンドすることが保証されて?

ローン学習者:

私のコード:

#include <stdio.h>
#include <limits.h>

int main()
{
    char c = CHAR_MAX;
    c += 1;
    printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}

出力:

CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()

私たちはインクリメントときことを確認charする変数セットをCHAR_MAX、それがラップアラウンドしますCHAR_MINこの動作は保証されていますか?それともそれは未定義の動作や実装に指定された動作になるだろうか?何がこの程度C99標準発言していますか?

[注:CHAR_MAX(127)よりも所与の値を大きくするときのchar型に何が起こるか、char型のC = 129が-127に変換されますなぜC-?彼らは範囲外の値に値をインクリメントしない範囲外の値を割り当てることについて話しているため、この問題に対処していません。]

アンティHaapala:

質問は2つあり:第一に、あります

char c = CHAR_MAX;
c += 1;

とは異なって評価

char c = CHAR_MAX;
c = c + 1;

そして答えは何のことはないではない、なぜならC11 / C18 6.5.16.2p3

  1. フォームの化合物の割り当てはE1 op = E2、単純な代入式と等価であるE1 = E1 op (E2)左辺値は点を除いてE1、一度だけ評価され、不定順関数呼び出しに対して、複合代入の動作は、1つの評価です。場合E1原子型を有する、化合物割り当てが有するリードモディファイライト動作であるmemory_order_seq_cstメモリ順序セマンティクスは。113)

そこで、質問がで何が起こるかですc = c + 1ここでは、オペランド+の通常の算術変換を受け、cそして1そのために昇格されint、本当に奇抜なアーキテクチャがその必要がない限り、charに昇格されますunsigned int計算+を評価され、その結果、型のint/ unsigned int変換に戻ってcharに記憶c

あり3これは、その後に評価することができる実装定義の方法は:

  • CHAR_MIN0であるため、char符号なしです。

    どちらかchar、その後に昇格されintたりunsigned int、それがに昇格されている場合intは、CHAR_MAX + 1必ずしもに収まるintすぎて、オーバーフローしません場合、またはunsigned intそれが合うか、ゼロにラップアラウンドすることがあります。数値のいずれかで、結果の値、ときCHAR_MAX + 1または0剰余の減少、に戻った後はc、剰余還元後、それは、つまり0になりますCHAR_MIN

  • そうでない場合はchar署名されている場合、次にCHAR_MAXよりも小さい場合INT_MAX、結果がCHAR_MAX + 1収まるようint、標準C11 / C18 6.3.1.3p3は時起こる変換に適用割付

    1. そうでなければ、新しいタイプが署名され、その値はで表すことができません。結果は実装定義であるか、または実装定義信号が発生されますか。
  • または、IFF sizeof (int) == 1 char署名されているが、その後charに昇格しint、そしてCHAR_MAX == INT_MAX=>はCHAR_MAX + 1、整数オーバーフローが発生し、動作は不定となります

つまり可能な結果は以下のとおりです。

  • 場合はchar、符号なし整数型で、結果は常にある0、すなわちCHAR_MIN

  • そうでない場合はchar符号付き整数型であり、動作は実装定義/未定義です。

    • CHAR_MIN またはいくつかの他の実装定義値、
    • 実装定義信号は、おそらくプログラムを終了、上昇さ
    • や行動はどこ一部のプラットフォームで定義されていませんsizeof (char) == sizeof (int)

すべてのインクリメント操作はc = c + 1c += 1c++++c同じプラットフォーム上で同じ副作用を持っています。式の評価値は、c++の値になりますc増分の前に。他の3のために、それはの値になりますcインクリメント後。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=369259&siteId=1