0

私はCが初めてです。

たとえばint、最大値が 32767 であるとします (ただし、この値は他のシステムでは異なる場合があります)。私の質問は、C プログラムまたは関数を使用して任意のデータ型に対してこれらの値を取得する方法です。

int私はこのアプローチを試みていましたが、戻ります-1

#include<stdio.h>
void main(void){

unsigned int x=1;
unsigned long count=0;

for(x=1;;x++){

    if(x==0){break;}
    count++; 

    }

printf("%ld",count);

}
4

6 に答える 6

6

limits.hタイプの制限(または境界)を表すいくつかの値を定義します。あなたの場合、INT_MINそしてINT_MAXは、が保持できる最小値と最大値を見つけるためのポータブルな方法になりますint

http://en.wikibooks.org/wiki/C_Programming/C_Reference/limits.h

于 2012-06-22T08:47:04.293 に答える
4

ヘッダーlimits.hには定数UINT_MAXがあります。これは必要な値です。

あなたが見た理由は、-1それ%ldが。の間違ったprintfフォーマットであるということですunsigned long。を使用し%luます。

Cは実際にはジェネリックプログラミングを対象としていませんが、最新の標準C11は、引数のタイプ(「タイプジェネリック式」)に応じて異なることを行うマクロを提供します。

私はそれらを使用したことはありませんがNUMERIC_LIMITS_MAX、マッピングなどを非表示にするマクロをint -> INT_MAX作成できると思いますunsigned char -> UCHAR_MAX。完全なものは言うまでもなく、C11の部分的な実装は多くないため、結果のコードは(まだ)あまり移植性がありません。 。

とはいえ、符号なしタイプの場合は、いつでも最大値を取得できます(unsigned long)(-1)。署名された型は少し厄介です。なぜなら、標準は実装に多くの奇妙なことをする自由を与えているからです。実際にINT_MAXは、はに等しい(((unsigned int)(-1)) / 2) + 1です。理論的には、intより多くのパディングビットを持つことができます。unsigned intこの場合INT_MAXは小さくなります。

于 2012-06-22T08:47:07.167 に答える
3

これを確認してください。一般に、CまたはC ++について質問がある場合は、最初にこのサイトで調べてみてください。これは優れたリファレンスです。

于 2012-06-22T08:49:21.950 に答える
1

必要なのは#include <limits.h>

于 2012-06-22T08:48:56.290 に答える
0

実行時に int の最大値を取得するソリューション:

int main ( )
{
    unsigned int y = (unsigned int)(~0)>>1;
    printf ("max of int is %u\r\n",y);
    return 1;
}

説明:

y = ~00 のバイナリで反対の y を設定します。システムが 32 ビットの場合、0 はバイナリで (0000...0)(32) で表され、バイナリでの反対は (1111...1)(32) になります。 .

y>>1y を 1 ビットシフトして、y の値が (0111..1)(31) になるようにします。これは int の最大値です。

于 2012-06-22T09:18:35.563 に答える
0

-1を印刷するだけ

#include "stdint.h"

printf("Byte :%u, Short :%hu,  Int :%u, Long Long :%llu\n",
             (uint8_t)-1, (uint16_t)-1, (uint32_t)-1, (uint64_t)-1);

出力は次のとおりです。

Byte:255、Short:65535、Int:4294967295、Long Long:18446744073709551615

私はLinuxを使用しています...

于 2012-06-22T09:18:50.323 に答える