Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是不是;int";在C语言中,总是有与操作系统相同的位数吗?_C - Fatal编程技术网

是不是;int";在C语言中,总是有与操作系统相同的位数吗?

是不是;int";在C语言中,总是有与操作系统相同的位数吗?,c,C,在系统上,C中的数据类型“int”是否总是与操作系统的位数相同 谢谢 不,不一定。举个明显的例子,如果在64位操作系统上使用32位编译器,通常会使用32位ints C标准中的要求相当低。除了最小尺寸要求外,还有(§6.2.5/5): “普通”的int对象具有执行环境架构建议的自然大小(大到足以包含头中定义的int\u MIN到int\u MAX范围内的任何值) 如果需要确保您的类型至少为64位,可以使用long 其他答案中提到了int32\t等类型。尽管此类型通常用于其他目的,但实际上它适用于需

在系统上,C中的数据类型“int”是否总是与操作系统的位数相同


谢谢

不,不一定。举个明显的例子,如果在64位操作系统上使用32位编译器,通常会使用32位
int
s

C标准中的要求相当低。除了最小尺寸要求外,还有(§6.2.5/5):

“普通”的
int
对象具有执行环境架构建议的自然大小(大到足以包含头
中定义的
int\u MIN
int\u MAX
范围内的任何值)

如果需要确保您的类型至少为64位,可以使用
long

其他答案中提到了
int32\t
等类型。尽管此类型通常用于其他目的,但实际上它适用于需要正好32位宽的类型的情况,而不管这对性能有何影响

这意味着您通常希望避免这些类型。如果您只需要确保至少可以保存一个64位整数而不发生溢出,则
long-long
int\u fast64\u t
是更好的选择(同样,对于32位类型也是如此)。现在,对于一个64位类型,它不同于这将使一个64位类型有很大的不同

不过,对于32位类型(例如),这可能会有所不同
int32\t
必须正好是32位宽,但在64位处理器上运行的64位操作系统上的64位进程中,64位类型很可能比32位类型快。我已经将一些使用
int32\t
的旧代码(但不是非常旧)的速度大约提高了三倍。当时(在32位编译器和操作系统上)它没有引起问题,但在64位系统上,它带来了相当多的额外工作,因为他们真正想要的是
int\u fast32\t
——支持至少32位的最快类型


类似地,在未来的某个时候,我们将开始使用比64位“大”的处理器,这几乎是不可避免的。当我们这样做的时候,我们可能会遇到64位类型与现在32位类型相同的情况:当人们可能想要
int\u fast64\u t
时,会有很多地方使用
int64\u t
,他们的代码会比实际需要的运行速度慢很多,因为他们需要自己的代码(例如)128位处理器,将操作数屏蔽为64位,而不是使用处理器本身的大小。

否。这取决于操作系统和体系结构(即:运行操作系统的处理器类型)。常见的基本类型,如
int
unsigned
等,将取决于系统,因此根据您使用的系统,
int
可以是16、32或任意大小

如果要保证值的大小,需要使用固定宽度类型。如果您想这样做,请查看
,以及它为您提供的新原语,如
int32\u t
uint8\u t
,等等

参考资料


  • 整数类型,2014年2月14日访问,

  • 标准不要求这样做。它通常在实践中可能是错误的,但提到它在嵌入式系统中更常见。

    在64位Debian上,这个小程序

    #include <stdio.h>
    
    int main() {
        #define printSize(aType) printf("sizeof " #aType " = %ld\n", sizeof(aType))
        printSize(void*);
        printSize(char);
        printSize(short);
        printSize(int);
        printSize(long);
        printSize(long long);
    }
    
    因此,在64位系统中,
    int
    不仅不要求为64位,而且在现实世界中,int的大小与指针大小不同的通用系统也是如此。因此,您不应该依赖于这些类型的大小


    此规则也有例外,您可以依赖基本类型的大小。这些都在C标准中明确提到。最重要的两个方面是:

  • char
    必须是一个8位(但不能指望它是有符号的或无符号的)

  • long-long
    要求至少为64位


  • 当然,
    long
    要求至少与
    int
    等一样大。

    (a)一个操作系统“有”多少位?(b) 没有;在大多数主流64位操作系统使用的ABI中,
    int
    是32位的。。。因此,答案肯定是“否”。C程序编译时使用的操作系统不需要与程序运行时使用的操作系统相同(交叉编译)。c程序本身不需要与两个操作系统具有相同的int大小。C程序在运行时甚至可能没有操作系统。“int”的位数完全取决于编译器吗?@T…:是的,至少正常情况下是这样(我想可能会有一些奇怪的实现,但通常确实如此)。谢谢!在我的Ubuntu中,`/usr/include/limits.h`似乎不是特定于编译器的。那么这是否意味着操作系统和编译器可能会有不同数量的“int”位?@T…:外观可能是骗人的——该头是特定于编译器的。如果您使用普通的软件包管理工具安装它,您几乎肯定会安装一个与操作系统匹配的编译器。实际上,C标准(在其他地方)承诺
    int
    至少有16位宽。被您的最后一点弄糊涂了-C标准定义了所有基本数字类型的最小大小,不仅仅是
    char
    long
    ,而且
    char
    必须至少是8位,它可以更大。@PaulGriffiths是的,我在最后一部分有点太窄了。把它改得更一般一点。但是,C11标准要求
    char
    类型正好是一个字节。这过去是不同的,在C99中,确实不允许您对sizeof void* = 8 sizeof char = 1 sizeof short = 2 sizeof int = 4 sizeof long = 8 sizeof long long = 8