4
#include <stdio.h>

double metersToFeet(double meters)
{
    return meters / 0.3048;
}

int main()
{
    printf("%u\n", (unsigned char)(char)(45.72 / 0.3048));
    printf("%u\n", (unsigned char)(char)metersToFeet(45.72));
    return 0;
}

このプログラムは (GCC と Clang の両方で) 以下を出力します。

127
150

2 つの異なる番号が表示されるのはなぜですか?

4

2 に答える 2

8

署名されている場合、実際の答え (150) はchar(通常のシステムでは) a の範囲を超えています。この変換は、未定義の動作を引き起こします。コンパイラは好きなことを自由に行うことができます。

C99 標準 6.3.1.4 から:

実数浮動小数点型の有限値が _Bool 以外の整数型に変換される場合、小数部分は破棄されます (つまり、値はゼロに向かって切り捨てられます)。整数部の値が整数型で表現できない場合の動作は未定義です。

于 2013-06-05T00:17:07.840 に答える
5

45.72 / 0.3048です150

あなたのプラットフォームの型charは明らかに 8-but 符号付き型です。150そのタイプの範囲外です。これは、動作が未定義であることを意味します。残りは次のとおりです。

たとえば、127 127ideone.com から GCC にアクセスし150 150、MSVC にアクセスしています。127 150これは面白いですが、驚くべきことではありません。

于 2013-06-05T00:20:03.760 に答える