如何根据操作系统的位数(32或64)来定义输出?

本文探讨了如何根据操作系统的位数(32位或64位)来定义输出格式,特别是针对int64_t类型的变量。讨论了不同方法的优缺点,并提供了一种通过shell脚本来自动检测系统位数并定义相应宏的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何根据操作系统的位数(32或64)来定义输出?我使用了int64_t,使用printf输出一个int64_t整数时,对于32位系统,应使用%lld,对于64位系统,应使用%ld。
我想将输出格式修饰符采用宏定义的方式事先定义好,Linux下貌似可以这样定义:
#if __WORDSIZE == 64
#define FDFS_INT64_FORMAT "%ld"
#else
#define FDFS_INT64_FORMAT "%lld"
#endif
但这样定义是不能跨平台的。

我试过如下定义:
#if sizeof(int64_t) == 8
#define FDFS_INT64_FORMAT "%ld"
#else
#define FDFS_INT64_FORMAT "%lld"
#endif
gcc报错。

我想到一个办法是在Makefile中自动检测操作系统的位数,然后通过-D来定义一个宏。
请问大家,有没有更好的办法?有个疑问,int64_t,不总是64位的么?没有用过,只是觉得看其字面,应该总是64位才对吧。与其去寻找系统的字长,不如为自己的数据设置一个合适的固定长度的整数类型#include <stdint.h>
#include <stdio.h>

static int64_t i64;
static int32_t i32;
static int16_t i16;
static int8_t i8;

void op8() {i8 = 1;}
void op16() {i16 = 1;}
void op32()&nbsp;&nbsp;&nbsp;&nbsp;{i32 = 1;}
void op64()&nbsp;&nbsp;&nbsp;&nbsp;{i64 = 1;}

int getWordlength()
{
&nbsp;&nbsp;&nbsp;&nbsp;int d8, d16, d32, d64;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;d8 = &op16 - &op8 - 5;
&nbsp;&nbsp;&nbsp;&nbsp;d16 = &op32 - &op16 - 5;
&nbsp;&nbsp;&nbsp;&nbsp;d32 = &op64 - &op32 - 5;
&nbsp;&nbsp;&nbsp;&nbsp;d64 = (char *)&getWordlength - (char *)&op64 - 5;

&nbsp;&nbsp;&nbsp;&nbsp;if (d16 == 2 * d8) return 8;
&nbsp;&nbsp;&nbsp;&nbsp;else if (d32 == 2 * d16) return 16;
&nbsp;&nbsp;&nbsp;&nbsp;else if (d64 == 2 * d32) return 32;
&nbsp;&nbsp;&nbsp;&nbsp;else return 64;
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("Word length: %d\n", getWordlength());
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}
原帖由 ivhb 于 2008-9-11 18:24 发表 http://bbs.chinaunix.net/images/common/back.gif
有个疑问,int64_t,不总是64位http://www.easymjm.com的么?没有用过,只是觉得看其字面,应该总是64位才对吧。

这个类型的确会保证是64位。我的问题是如何格式化输出:对于32位系统,应使用%lld,对于64位系统,应使用%ld。
我要根据操作系统的位数来选择是用%lld还是%ld,想通过宏定义的方式解决这个问题。
如果通过程序(非宏定义)方式实现,那是没有任何问题的。sizeof(int) * 8
原帖由 xiaonanln 于 2008-9-11 18:53 发表 http://bbs.chinaunix.net/images/common/back.gif
#include
#include

static int64_t i64;
static int32_t i32;
static int16_t i16;
static int8_t i8;

void op8() {i8 = 1;}
void op16() {i16 = 1;}
void op32() {i32 = ... 我后来是通过shell来实现的。通过shell自动生成一个头文件fdfs_os_bits.h,头文件中通过宏OS_BITS来定义操作系统的位数(32或者64)。在Linux中已经调试通过。

shell代码片断如下http://www.beneficials.net:
tmp_src_filename=fdfs_check_bits.c
cat <<EOF > $tmp_src_filename
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(long));
return 0;
}
EOF

cc $tmp_src_filename
bytes=`./a.out`

请教一个c语言发送邮件的问题/>/bin/rm -fa.out $tmp_src_filename
if [ "$bytes" -eq 8 ]; then
OS_BITS=64
else
OS_BITS=32
fi

cat <<EOF > common/fdfs_os_bits.h
#ifndef _FDFS_OS_BITS
#define _FDFS_OS_BITS

#define OS_BITS$OS_BITS

#endif
EOF#ifdef _WIN64
#ifdef _WIN32
linux下就不知道了原帖由 happy_fish100 于 2008-9-11 19:00 发表 http://bbs.chinaunix.net/images/common/back.gif


这个类型的确会保证是64位。我的问题是如何格式化输出:对于32位系统,应使用%lld,对于64位系统,应使用%ld。
我要根据操作系统的位数来选择是用%lld还是%ld,想通过宏定义的方式解决这个问题。
如果通过 ...

long long类型实现上都是64位的吧。为啥不简化一下?
一律 printf ("%lld", (long long) xxx);
和位数还有关系么?回复 #1 happy_fish100 的帖子你用uname -a,然后去cut,就能得出来操作系统的位数啦,然后通过宏来搞定。

 

http://blog.sina.com.cn/s/blog_69b099ed0101237l.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值