如何在c++中指定64位整数

9wbgstp7  于 2023-01-08  发布在  其他
关注(0)|答案(6)|浏览(315)

我试图在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));

我得到的回答是:
长整型的大小:4长整型的大小: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”类型太大
当我用'int64_t'替换'long long int'时,得到了相同的结果。我假设'int64_t'是可识别的,因为它本身没有生成任何错误消息。
看起来我的8字节长的整型实际上是6字节长的整型,我不明白我错过了什么,如果有帮助的话,这里是我的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位整数是我访问,我真的很感激任何帮助。谢谢...

cu6pst1q

cu6pst1q1#

stdint.h用于整型数据类型的特定大小,还可以为整型常量使用适当的后缀,例如:

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;
gpnt7bae

gpnt7bae2#

尝试在数字上加上LL后缀,编译器可能会将其强制转换为中间类型作为分析的一部分。
long long int i2 = 0x0000444400004444LL;
另外,编译器丢弃前导零,因此0x000044440000变为0x44440000,这是一个完全可以接受的32位整数(这就是为什么在f2之前没有看到任何警告)。

6psbrbz9

6psbrbz93#

使用int64_t,即可移植的C99代码。

int64_t var = 0x0000444400004444LL;

用于打印:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);
z31licg0

z31licg04#

如何在c++中指定64位整数
与附加LL的"通常"好主意相反。
LL追加到 * 整型常量 * 将确保类型至少与long long一样宽。如果 * 整型常量 * 是八进制或十六进制,则常量将根据需要变为unsigned long long

    • 如果ones不介意指定太宽的类型,那么LL就可以了。**否则,请继续阅读。

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
6ju8rftf

6ju8rftf5#

对于64位(long long int),将ll后缀附加到十六进制数字;对于无符号64位(unsigned long long),将ull后缀附加到十六进制数字

y0u0uwnf

y0u0uwnf6#

可疑的编译器错误

从C99开始,所有4个常量都应该按原样编译,没有警告。不需要LL后缀。

long long int f2 = 0x0000444400004;
long long int g2 = 0x00004444000044;
long long int h2 = 0x000044440000444;
long long int i2 = 0x0000444400004444;
// The last 4 variables (f2,g2,h2,i2) give me the error message:
// warning: integer constant is too large for ‘long’ type

在C89中,编译器应该报告long long,除非long long可以作为编译器扩展。在这种情况下,是否需要后缀取决于编译器扩展。

相关问题