web-dev-qa-db-ja.com

Cで64ビット整数を指定する方法

私はCで64ビット整数を使用しようとしていますが、それが可能かどうかについての混合信号を取得しています。

Printfを実行すると:

printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int));

私が得る応答は次のとおりです。

Long int:4のサイズlong long int:8のサイズ

これにより、long long intは8バイト= 64ビットであると感じます。

ただし、次の変数を宣言しようとすると:

long long int a2 = 0x00004444;
long long int b2 = 0x000044440;
long long int c2 = 0x0000444400;
long long int d2 = 0x00004444000;
long long int e2 = 0x000044440000;
long long int f2 = 0x0000444400004;
long long int g2 = 0x00004444000044;
long long int h2 = 0x000044440000444;
long long int i2 = 0x0000444400004444;

最後の4つの変数(f2、g2、h2、i2)からエラーメッセージが表示されます。

警告:整数定数は「long」型には大きすぎます

「long long int」を「int64_t」に置き換えても同じ結果が得られます。 「int64_t」はそれ自体のエラーメッセージを生成しなかったため、認識されたと仮定します。

したがって、8バイトのlong long intは実際には6バイトのlong long intであり、ここで何が欠けているのか理解できません。それが助けであれば、ここに私のgccコンパイラに関する情報があります:

me@ubuntu:~$ gcc -v  
Using built-in specs.  
Target: i686-linux-gnu  
Configured with: ../src/configure -v   
--with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5'  
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs   
--enable-languages=c,c++,fortran,objc,obj-c++  
--prefix=/usr   
--program-suffix=-4.4   
--enable-shared   
--enable-multiarch   
--enable-linker-build-id   
--with-system-zlib   
--libexecdir=/usr/lib   
--without-included-gettext   
--enable-threads=posix   
--with-gxx-include-dir=/usr/include/c++/4.4   
--libdir=/usr/lib   
--enable-nls   
--with-sysroot=/ -  
-enable-clocale=gnu   
--enable-libstdcxx-debug   
--enable-objc-gc   
--enable-targets=all 
--disable-werror   
--with-Arch-32=i686   
--with-tune=generic   
--enable-checking=release   
--build=i686-linux-gnu   
--Host=i686-linux-gnu   
--target=i686-linux-gnu  
Thread model: posix  
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)   

64ビット整数にどのように(または)アクセスできるかを誰かが知っているなら、助けていただければ幸いです。ありがとう....

50
user1245262

整数データ型の特定のサイズにはstdint.hを使用し、整数リテラル定数には適切なサフィックスも使用します。例:

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;
69
Paul R

番号にLLサフィックスを試してください。コンパイラは、解析の一部としてそれを中間型にキャストしている可能性があります。 http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html を参照してください

long long int i2 = 0x0000444400004444LL;

さらに、コンパイラーは先行ゼロを破棄しているため、0x0000444400000x44440000になります。これは完全に受け入れ可能な32ビット整数です(そのため、f2)。

28
Martin Beckett

ポータブルC99コードであるint64_tを使用します。

int64_t var = 0x0000444400004444LL;

印刷用:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);
5
Karoly Horvath

Cで64ビット整数を指定する方法

usualに反して、LLを追加することをお勧めします。

LLinteger constantに追加すると、少なくともlong longと同じ幅になります。 整数定数が8進数または16進数の場合、必要に応じて定数はunsigned long longになります。

タイプの幅を広げすぎても構わない場合は、LLで構いません。 else、続きを読みます。

long longは64ビットより広い場合があります。

今日、long longが64ビットではないことはめったにありませんが、Cはlong long少なくとも64ビットに指定します。したがって、将来的にLLを使用することにより、コードは、たとえば128ビットの数値を指定する可能性があります。

Cには整数定数のマクロがあり、以下の場合はint_least64_t型になります

#include <stdint.h>
#include <inttypes.h>

int main(void) {
  int64_t big = INT64_C(9223372036854775807);
  printf("%" PRId64 "\n", big);
  uint64_t jenny = INT64_C(0x08675309) << 32;  // shift was done on at least 64-bit type 
  printf("0x%" PRIX64 "\n", jenny);
}

出力

9223372036854775807
0x867530900000000
3
chux

Ll接尾辞を64ビットの16進数に追加(long long int)、または符号なし64ビットのull接尾辞(unsigned long long)

1
sbf