字符串表示所需字节数计算及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
相关产品推荐
相关产品推荐

