是否可以在不使用第三方库的情况下告知运行时C中整数类型的字节数

时间:2018-03-31 15:06:00

标签: c linux posix

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

基本上我的想法是寻找一种方法来检查UINT_MAX的系统限制,而不需要我的二进制文件在编译时依赖该信息。我首先考虑尝试sysconf(),但该变量未指定为可以使用的变量。

编辑1: 澄清我正在做的是建立我自己的od程序,基于阅读od实用程序的POSIX 1003.1-2017规范。

具体来自我在扩展描述中对这些行的阅读和解释。

  

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

我读到这意味着默认值是基于正在运行的系统的环境而不是编译器

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

谢谢大家。

2 个答案:

答案 0 :(得分:3)

如果您想知道您的可执行文件使用的signinBut.addEventListener("click", e => { firebase.auth().signInWithPopup(provider).catch(function(error) { var errorCode = error.code; var errorMessage = error.message; var email = error.email; var credential = error.credential; }); }); firebase.auth().onAuthStateChanged(function(user) { user = result.user; }); 的大小,那么您可以使用int,因为编译后大小不会改变(即使您在另一个处理器上运行它。)

如果你想知道你的程序在这台机器上编译时会有sizeof的大小,那么最简单的方法就是编译并运行这样的东西:

int

(或者你可以在运行的机器上grep包含UINT_MAX的目录)

如果您想在不同架构之间移动int main() { printf("%zu\n", sizeof(int)); } 那么这就是一个完全不同的故事。

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

编辑:

int

工作得很好。

答案 1 :(得分:0)

如果您仍想在运行时获得它,可以使用以下内容 -

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包含答案。