【发布时间】:2015-11-01 21:43:10
【问题描述】:
在 128 位 RISC-V(或其他 128 位机器)中,C/C++ 中的“long”和“long long”数据类型有多大?
澄清一下:在没有其他实现符合的情况下,编译器的实现者在为这样的机器编写limits.h文件时可能期望使用的大小是多少?
【问题讨论】:
在 128 位 RISC-V(或其他 128 位机器)中,C/C++ 中的“long”和“long long”数据类型有多大?
澄清一下:在没有其他实现符合的情况下,编译器的实现者在为这样的机器编写limits.h文件时可能期望使用的大小是多少?
【问题讨论】:
它们可以是编译器编写者想要的任何大小,前提是它们至少与其前身类型一样大(long int 对应于long long int,int 对应于long int)和满足标准中规定的最小范围。
例如,参见 C11 中的 5.2.4.2 Numerical limits,其中说明了所需的最小范围:
long int
LONG_MIN -2147483647 // −(2^31 − 1)
LONG_MAX +2147483647 // 2^31 − 1
long long int
LLONG_MIN -9223372036854775807 // −(2^63 − 1)
LLONG_MAX +9223372036854775807 // 2^63 − 1
请注意,这些不是您的完整二进制补码范围,因为它们还必须考虑其他两种编码方案,即二进制补码和符号幅度,它们都具有以下概念负零。
如果你真的想知道,你可以在limits.h头文件中查找这些值,或者编译运行:
#include <stdio.h>
#include <limits.h>
int main (void) {
printf ("BITS/CHAR %d\n", CHAR_BIT);
printf ("CHARS/SHORT %d\n", sizeof(short));
printf ("CHARS/INT %d\n", sizeof(int));
printf ("CHARS/LONG %d\n", sizeof(long));
printf ("CHARS/LLONG %d\n", sizeof(long long));
putchar ('\n');
printf ("SHORT MIN %d\n", SHRT_MIN);
printf ("SHORT MAX %d\n", SHRT_MAX);
printf ("INT MIN %d\n", INT_MIN);
printf ("INT MAX %d\n", INT_MAX);
printf ("LONG MIN %ld\n", LONG_MIN);
printf ("LONG MAX %ld\n", LONG_MAX);
printf ("LLONG MIN %lld\n", LLONG_MIN);
printf ("LLONG MAX %lld\n", LLONG_MAX);
return 0;
}
在我的系统上,一个相当标准的系统(并且稍微重新格式化以看起来很漂亮):
BITS/CHAR 8
CHARS/SHORT 2
CHARS/INT 4
CHARS/LONG 4
CHARS/LLONG 8
SHORT MIN -32768
SHORT MAX 32767
INT MIN -2147483648
INT MAX 2147483647
LONG MIN -2147483648
LONG MAX 2147483647
LLONG MIN -9223372036854775808
LLONG MAX 9223372036854775807
所以看起来,在这个系统上,我有二进制补码(负数/正数的最后一位上的 8/7 不匹配),没有填充位,16 位 short int,32 位 int和long int 和64 位long long int。
如果你在自己的环境中运行类似的代码,那应该能够告诉你类似的信息。
【讨论】:
long long 的大小还有第二个约束:它必须至少为 64 位。这是由 C 标准保证的。
n-bit 实体中准确存储2^n 唯一值,long long int 的最小 范围意味着abs(LLONG_MIN) + LLONG_MAX + 1 唯一值(零加一)。 ceil(log2(abs(LLONG_MIN) + LLONG_MAX + 1)) 的结果是 64,因此它是该类型的 最小 宽度(以位为单位)。请注意,这并不一定意味着 8 个字节,因为 CHAR_BIT 是实现定义的,可以不同于 8 个字节。
根据标准,命名的非数字有符号整数类型有:
Type name Possible size
signed char — 8
short — 16
int — 32
long — 64
long long — 128
intmax_t — 256
(“非数字”是指忽略int_least8_t、int_fast16_t 和int32_t 等)
列出的大小不是 C 标准规定的大小,但它们是标准级数,每个连续类型中的位数是其两倍。在 128 位机器上,假设long long 的长度为 128 位是合理的。如果编译器编写者想要支持 256 位类型,将intmax_t 变成 256 位类型并不奇怪。但除此之外,你的名字已经用完了。通常,其中一些类型共享相同的大小。
所有标准要求是列表中前面的类型不长于列表后面的类型,char 至少为 8 位,short 和 int 至少为 16 位,即long 至少为 32 位,long long 至少为 64 位。
【讨论】:
包含limits.h 头文件并打印所需类型的大小。
#include <limits.h>
int main () {
printf ("Size of long long is : %d\n", sizeof(long long));
return 0;
}
【讨论】: