在不使用第三方库的情况下,是否可以在运行时告诉C中一个整数类型有多少字节
我希望在运行时探测int在运行时的字节数,而不使用POSIX C 基本上,我的想法是寻找一种方法来检查UINT_MAX的系统限制,而不必让我的二进制文件在编译时依赖这些信息。我最初想尝试在不使用第三方库的情况下,是否可以在运行时告诉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编译器,则
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,默认字节数应对应于底层实现的基本整数类型的大小”。我把它理解为运行时。在运行时它已经太晚了。编译器必须在编译时知道这一点。您可以使用likeint64\t
(它是C99和更高版本标准的一部分)。类型的大小不能在运行时更改。我没有想到这一点。如果我找不到运行时解决方案,那可能是最佳解决方案。谢谢。您为什么要在运行时专门执行此操作。我基本上是在POSIX 1003.1-2017规范的基础上构建我自己的od
,在扩展规范状态下,对于不包含c99编译器的系统,“类型说明符字符d、o、u和x,默认字节数应对应于底层实现的基本整数类型的大小”。我把它理解为运行时。在运行时它已经太晚了。编译器必须在编译时知道这一点。您可以使用likeint64\t
(它是C99和更高版本标准的一部分)。