首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ndk 17.0.4的比较分析

ndk 17.0.4的比较分析
EN

Stack Overflow用户
提问于 2018-05-24 03:41:49
回答 1查看 106关注 0票数 0

下面我有一个关于比较的问题。

代码语言:javascript
复制
AK_FORCE_INLINE static int intArrayToCharArray(const int *const source, const int sourceSize,
    char *dest, const int destSize) {
// We want to always terminate with a 0 char, so stop one short of the length to make
// sure there is room.
const int destLimit = destSize - 1;
int si = 0;
int di = 0;
while (si < sourceSize && di < destLimit && 0 != source[si]) {
    const int codePoint = source[si++];
    if (codePoint < 0x7F) { // One byte
        dest[di++] = codePoint;
    } else if (codePoint < 0x7FF) { // Two bytes
        if (di + 1 >= destLimit) break;
        dest[di++] = 0xC0 + (codePoint >> 6);
        dest[di++] = 0x80 + (codePoint & 0x3F);
    } else if (codePoint < 0xFFFF) { // Three bytes
        if (di + 2 >= destLimit) break;
        dest[di++] = 0xE0 + (codePoint >> 12);
        dest[di++] = 0x80 + ((codePoint >> 6) & 0x3F);
        dest[di++] = 0x80 + (codePoint & 0x3F);
    } else if (codePoint <= 0x1FFFFF) { // Four bytes
        if (di + 3 >= destLimit) break;
        dest[di++] = 0xF0 + (codePoint >> 18);
        dest[di++] = 0x80 + ((codePoint >> 12) & 0x3F);
        dest[di++] = 0x80 + ((codePoint >> 6) & 0x3F);
        dest[di++] = 0x80 + (codePoint & 0x3F);
    } else if (codePoint <= 0x3FFFFFF) { // Five bytes
        if (di + 4 >= destLimit) break;
        dest[di++] = 0xF8 + (codePoint >> 24);
        dest[di++] = 0x80 + ((codePoint >> 18) & 0x3F);
        dest[di++] = 0x80 + ((codePoint >> 12) & 0x3F);
        dest[di++] = 0x80 + ((codePoint >> 6) & 0x3F);
        dest[di++] = codePoint & 0x3F;
    } else if (codePoint <= 0x7FFFFFFF) { // Six bytes
        if (di + 5 >= destLimit) break;
        dest[di++] = 0xFC + (codePoint >> 30);
        dest[di++] = 0x80 + ((codePoint >> 24) & 0x3F);
        dest[di++] = 0x80 + ((codePoint >> 18) & 0x3F);
        dest[di++] = 0x80 + ((codePoint >> 12) & 0x3F);
        dest[di++] = 0x80 + ((codePoint >> 6) & 0x3F);
        dest[di++] = codePoint & 0x3F;
    } else {
        // Not a code point... skip.
    }
}
dest[di] = 0;
return di;

}

这不是ndk 16和更低的问题。但是当我上升到ndk 17的时候,它会在下面造成错误。Android调试器在线显示

代码语言:javascript
复制
else if (codePoint <= 0x7FFFFFFF)

这是臭虫:

代码语言:javascript
复制
Error:(88, 30) error: comparison 'const int' <= 2147483647 is always true [-Werror,-Wtautological-constant-compare]

谢谢你的出席。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-24 14:11:55

因为codePoint是一个int,所以它是一个有符号的32位数字。我猜想NDK r17是更严格的(可能是添加了-Wtautological-constant-compare -在发布说明中找不到)。

我认为您不需要使用int,而是需要使用unsigned int (可能是uint_least16_t,甚至uint_fast16_t)。还请参见http://en.cppreference.com/w/cpp/language/types (字符类型节)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50500565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档