在128位RISC-V(或其他128位机器)中,有多长"长"和#34;漫长的" C / C ++中的数据类型?
澄清一下:在没有其他实现符合的情况下,为这样的机器编写limits.h文件时,编译器的实现者可能会使用的大小是什么?
答案 0 :(得分:8)
它们可以是编译器编写者想要的任何大小,但它们至少与其前任类型一样大(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
。
如果您在自己的环境中运行类似的代码,那么它应该可以告诉您类似的信息。
答案 1 :(得分:0)
包含limits.h标题并打印所需类型的大小。
#include <limits.h>
int main () {
printf ("Size of long long is : %d\n", sizeof(long long));
return 0;
}
答案 2 :(得分:-1)
根据标准,命名的非数字有符号整数类型为:
Type name Possible size
signed char — 8
short — 16
int — 32
long — 64
long long — 128
intmax_t — 256
(通过&#39;非数字&#39;,我的意思是忽略int_least8_t
,int_fast16_t
和int32_t
等。)
列出的尺寸不是C标准规定的尺寸,但它们是标准的进展,每个连续类型的位数是两倍。在128位机器上,假设long long
长度为128位是合理的。如果编译器编写器想要支持256位类型,那么将intmax_t
转换为256位类型并不奇怪。但除此之外,你已经没有名字了。通常,其中一些类型具有相同的大小。
所有标准要求是列表中较早的no类型比列表中稍后的类型长,char
至少为8位,short
和int
为至少16位,long
至少为32位,long long
至少为64位。