C 限制中的长位

C 限制中的长位,c,C,我正在为我的研究编写一个程序,因此我必须描述一些战争,以获得某些数据类型的限制。 当我写这篇文章时: #include <limits.h> #include <stdio.h> int main(void) { printf("%d\n", CHAR_BIT); printf("%d\n", LONG_BIT); return 0; } 甚至gcc-E也给了我这个 int main(void) { printf("%d\n", 8); p

我正在为我的研究编写一个程序,因此我必须描述一些战争,以获得某些数据类型的限制。 当我写这篇文章时:

#include <limits.h>
#include <stdio.h>

int main(void)
{
    printf("%d\n", CHAR_BIT);
    printf("%d\n", LONG_BIT);
    return 0;
}
甚至gcc-E也给了我这个

int main(void)
{
 printf("%d\n", 8);
 printf("%d\n", LONG_BIT);
 return 0;
}
但是一个极限,h没有给我答案。但是bits/xopen_lim.h有这个声明,当

__USE_XOPEN
已声明,但即使手动声明也不会给出结果

那么问题出在哪里呢?首页显示有一个长位宏,但gcc表示没有

gcc版本4.8.0(gcc) 拱门

[编辑] 对于那些说LONG_BIT不是c标准的人,输入

man 0 limits.h
并搜索长_位。对我来说,数值限制下有两个条目,因此我认为存在长位。
不,包括位/xopen\u lim.h不是一个真正的选项,因为它应该被限制包含。h而不是手动的长位在标准C中不是一件事

对于便携式方法,只需执行以下操作:

CHAR_BIT * sizeof(long)


限制中没有长\u位这样的内容。h

您的问题是不应该定义
\u使用\u XOPEN
。如果查看,您将看到它显式地取消定义,然后基于功能测试宏重新定义这些宏。您可能需要定义
\u XOPEN\u SOURCE
,例如:

gcc -D_XOPEN_SOURCE=700 -o longbit longbit.c
features.h

/*
 * Never include this file directly; use <limits.h> instead.
 */
_XOPEN_源代码包括POSIX和XPG。如果需要,设置为500 需要单个Unix一致性,对于 第六次修订,第七次修订为700。
_XOPEN\u源代码\u扩展的XPG东西和X/Open Unix 扩展

此外,wrt直接包括
xopen\u lim.h

/*
 * Never include this file directly; use <limits.h> instead.
 */
/*
*切勿直接包含此文件;改用。
*/

所以,我不建议直接包括它。另外,请参见或。

您是否手动包含标题xopen_lim.h?手册页告诉您的内容与标准C不同……但是,当手册页中有条目时,为什么不起作用?这就像你写了一本书,说太阳绕着地球转,但事实并非如此;)@cookiesoft:我不知道您的特定设置有什么问题;)但是在我看来,您应该更喜欢平台独立的方法,因为它很简单!这并不是说它不起作用。它的可移植性是你放弃你的方法,我不会用cplusplus.com作为任何参考。实际上更准确。但C标准是最终的参考标准。否决:这是不可移植的,这就是为什么长_位是必要的。看。@Loic-这不清楚。首先,听起来你好像在说
LONG\u BIT
更便于携带(尽管这不是一个标准的东西)。其次,我很难理解它的哪一部分是不可移植的(在某种程度上,
LONG\u-BIT
可以在它确实存在的平台上修复)。整数的大小(您建议的)大于或等于其宽度。有关如何计算宽度的说明,请参见:stackoverflow.com/questions/3957252。“LONG_BIT是必需的”,我指的是任何适合值的宏;长钻头确实是非标准的。另请参见:“然而,在Cray vector系统上,可能需要注意的是,short和int总是以8字节的形式存储(sizeof表示),但仅使用32或46位。”@loic-这是不可能的。log2(x)永远不会大于x(其中x是类型的最大可能值)。最后的参数与问题无关。您最初的建议只是不可移植(但恰好可以在普通硬件上使用)。根据gmp的文件:在Cray向量系统上,int的大小(以位为单位)是64,但int的宽度(以位为单位)只有46。或者,为了使用对数:size==log2(2^64)>log2(2^46)==width。此定义可能会有所帮助:对于给定无符号类型的宽度,此类型的最大值为2^width-1。另见:。