You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串表示所需字节数计算及LEN(LONG_MAX)输出19的技术疑问

问题解答

1. 字符串表示所需字节数的计算方法

  • 对于普通ASCII字符串:总字节数 = 有效字符个数 + 1(末尾的空终止符\0)。仅统计有效字符字节数用strlen();包含空终止符的总字节数,对字符串字面量或固定数组用sizeof()。
  • 对于UTF-8字符串:每个字符占1-4字节,总字节数为所有字符的字节数之和 + 1(空终止符)。可遍历字符串逐个统计字符字节数,或用strlen()获取有效字符的总字节数(不含空终止符)。
  • 对于宽字符(如UTF-16):每个字符占2字节,总字节数 = 字符个数 × 2 + 2(宽空终止符);UTF-32则每个字符占4字节,总字节数 = 字符个数 ×4 +4。

2. 为什么LEN(LONG_MAX)输出19而非8

你的代码宏逻辑和预期完全不匹配:

宏的实际行为

#define STRING(x) #x
#define LEN(x) ((int)sizeof(STRING(x)) - (int)1)
  • #x是预处理器的字符串化操作,会把参数直接转成字符串字面量。64位系统中LONG_MAX的数值是9223372036854775807,这个数字的字符串有19个字符,sizeof("9223372036854775807")结果是20(含空终止符),减1后得到19。

预期误区

你预期的8是long类型的字节数(64位系统中long占8字节),但这个宏和类型字节数无关,它计算的是参数字符串化后的字符长度。要获取long的字节数,直接写sizeof(long)即可。

宏字符串化的细节

若要控制宏参数先展开再字符串化,需用两层宏:

#define STRING(x) #x
#define STRING_EXPAND(x) STRING(x) // 先展开参数x,再字符串化
#define LEN(x) ((int)sizeof(STRING_EXPAND(x)) - 1)

用STRING_EXPAND(LONG_MAX)会先把LONG_MAX展开成数值再转字符串;直接用STRING(LONG_MAX)会得到"LONG_MAX",长度为8。

内容的提问来源于stack exchange,提问作者Paulson Raja L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:55:26