Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.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
在不使用第三方库的情况下,是否可以在运行时告诉C中一个整数类型有多少字节_C_Linux_Posix - Fatal编程技术网

在不使用第三方库的情况下,是否可以在运行时告诉C中一个整数类型有多少字节

在不使用第三方库的情况下,是否可以在运行时告诉C中一个整数类型有多少字节,c,linux,posix,C,Linux,Posix,我希望在运行时探测int在运行时的字节数,而不使用POSIX C 基本上,我的想法是寻找一种方法来检查UINT_MAX的系统限制,而不必让我的二进制文件在编译时依赖这些信息。我最初想尝试sysconf(),但该变量没有指定为可以使用的变量 编辑1: 为了澄清我所做的是在阅读POSIX 1003.1-2017实用程序规范的基础上构建我自己的od程序 具体从我对这些行的阅读和解读中展开描述 输出类型说明符d、f、o、u和x转换的默认字节数对应于各种C语言类型,如下所示。如果系统上存在c99编译器,则

我希望在运行时探测int在运行时的字节数,而不使用POSIX C

基本上,我的想法是寻找一种方法来检查UINT_MAX的系统限制,而不必让我的二进制文件在编译时依赖这些信息。我最初想尝试
sysconf()
,但该变量没有指定为可以使用的变量

编辑1: 为了澄清我所做的是在阅读POSIX 1003.1-2017实用程序规范的基础上构建我自己的
od
程序

具体从我对这些行的阅读和解读中展开描述

输出类型说明符d、f、o、u和x转换的默认字节数对应于各种C语言类型,如下所示。如果系统上存在c99编译器,则这些说明符应与该编译器默认使用的大小相对应。否则,这些尺寸可能因符合POSIX.1-2017的系统而异。 对于类型说明符字符d、o、u和x,默认字节数应与底层实现的基本整数类型的大小相对应

我理解这意味着默认值基于运行系统的环境,而不是编译器

编辑2:
sizeof
是我在反思中寻找的东西。我意识到,在没有libc的环境中,对于静态链接的二进制文件,我最初的想法是没有意义的


谢谢大家。

如果您想知道可执行文件使用的
int
的大小,那么您可以使用
sizeof
,因为编译后大小不会改变(即使在其他处理器上运行)


如果您想知道在这台机器上编译的
int
程序的大小,那么最简单的方法可能是编译并运行如下内容:

int main() {
    printf("%zu\n", sizeof(int));
}
(或者您可以在运行的计算机上为UINT_MAX grep include目录)

如果你想在不同的架构之间移动
int
,那就完全不同了

如果没有回答,请澄清你的意图

编辑:


非常好。

如果您想知道可执行文件使用的
int
的大小,那么您可以使用
sizeof
,因为编译后大小不会改变(即使在其他处理器上运行)


如果您想知道在这台机器上编译的
int
程序的大小,那么最简单的方法可能是编译并运行如下内容:

int main() {
    printf("%zu\n", sizeof(int));
}
(或者您可以在运行的计算机上为UINT_MAX grep include目录)

如果你想在不同的架构之间移动
int
,那就完全不同了

如果没有回答,请澄清你的意图

编辑:


工作非常好。

如果您仍然希望在运行时实现它,可以使用以下方法-

unsigned char myIntegerSizeOf(void) {
    int a[] = { ~0, 0 } ;
    unsigned char *a_ptr = (unsigned char *)&a[0] ;
    unsigned char count = 0 ;

    while (*a_ptr == 0xFF) { 
        count++ ; 
        a_ptr++ ;
    }

    return count;
}

count
包含答案。

如果您仍然希望在运行时获得答案,可以使用以下命令-

unsigned char myIntegerSizeOf(void) {
    int a[] = { ~0, 0 } ;
    unsigned char *a_ptr = (unsigned char *)&a[0] ;
    unsigned char count = 0 ;

    while (*a_ptr == 0xFF) { 
        count++ ; 
        a_ptr++ ;
    }

    return count;
}

count
包含答案。

在编译时使用。类型的大小不能在运行时更改。我没有想到这一点。如果我找不到运行时解决方案,那可能是最佳解决方案。谢谢。您为什么要在运行时专门执行此操作。我基本上是在POSIX 1003.1-2017规范的基础上构建我自己的
od
,在扩展规范状态下,对于不包含c99编译器的系统,“类型说明符字符d、o、u和x,默认字节数应对应于底层实现的基本整数类型的大小”。我把它理解为运行时。在运行时它已经太晚了。编译器必须在编译时知道这一点。您可以使用like
int64\t
(它是C99和更高版本标准的一部分)。类型的大小不能在运行时更改。我没有想到这一点。如果我找不到运行时解决方案,那可能是最佳解决方案。谢谢。您为什么要在运行时专门执行此操作。我基本上是在POSIX 1003.1-2017规范的基础上构建我自己的
od
,在扩展规范状态下,对于不包含c99编译器的系统,“类型说明符字符d、o、u和x,默认字节数应对应于底层实现的基本整数类型的大小”。我把它理解为运行时。在运行时它已经太晚了。编译器必须在编译时知道这一点。您可以使用like
int64\t
(它是C99和更高版本标准的一部分)。