gpt4 book ai didi

c++ - 在 C++ 中将 int 的最低有效位放入 char

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:36 25 4
gpt4 key购买 nike

我想找到一种最有效的方法来计算 char包含 int 的最低有效位在 C++11 中。该解决方案必须与任何可能的符合标准的编译器一起使用。 (我使用的是 N3290 C++ 草案规范,它本质上是 C++11。)

这样做的原因是我正在编写类似模糊测试器的东西,并且想检查需要 std::string 的库作为输入。所以我需要为字符串生成随机字符。我正在使用的伪随机生成器提供了低位非常均匀随机的整数,但我不确定确切的范围。 (基本上确切的范围取决于“测试用例的大小”运行时参数。)

如果我不关心在任何编译器上工作,这会很简单:

inline char int2char(int i) { return i; }

在您将此视为一个微不足道的问题之前,请考虑:

  • 你不知道char是有符号或无符号类型。

  • 如果 char已签名,然后从无法表示的 int 进行转换到 char是“实现定义的”(§4.7/3)。这比 undefined 好得多,但对于这个解决方案,我需要看到一些证据表明标准禁止诸如转换所有不在 CHAR_MIN 之间的整数之类的事情。和 CHAR_MAX'\0' .

  • reinterpret_cast不允许在有符号字符和无符号字符之间使用 (§5.2.10)。 static_cast执行与上一点相同的转换。

  • char c = i & 0xff; -- 尽管它消除了一些编译器警告-- 几乎肯定不是所有实现定义的转换都是正确的。特别是,i & 0xff总是一个正数,所以在 c 的情况下已签名很可能不会转换 i 的负值为 c 的负值.

以下是一些可行的解决方案,但在大多数情况下,我担心它们的效率不如简单的转换。对于如此简单的事情,这些似乎也太复杂了:

  • 使用 reinterpret_cast在指针或引用上,因为您可以从 unsigned char * 转换或 unsigned char &char *char & (但可能会以运行时开销为代价)。

  • 使用 char 的并集和 unsigned char ,您首先分配 intunsigned char , 然后提取 char (这又可能会更慢)。

  • 左右移动以对 int 进行符号扩展。例如,如果 i是 int,正在运行 c = ((i << 8 * (sizeof(i) - sizeof(c)) >> 8 * (sizeof(i) - sizeof(c)) (但这并不优雅,如果编译器没有优化掉这些转变,速度会非常慢)。

这是一个最小的工作示例。目标是证明断言在任何编译器上都不会失败,或者定义一个替代的 int2char其中断言永远不会失败。

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>

using namespace std;

constexpr char int2char(int i) { return i; }

int
main(int argc, char **argv)
{
for (int n = 1; n < min(argc, 127); n++) {
char c = -n;
int i = (atoi(argv[n]) << 8) ^ -n;
assert(c == int2char(i));
}
return 0;
}

我用 C++ 来表述这个问题,因为在网上更容易找到这些标准,但我同样对 C 中的解决方案感兴趣。这是 C 中的 MWE:

#include <assert.h>
#include <stdlib.h>

static char int2char(int i) { return i; }

int
main(int argc, char **argv)
{
for (int n = 1; n < argc && n < 127; n++) {
char c = -n;
int i = (atoi(argv[n]) << 8) ^ -n;
assert(c == int2char(i));
}
return 0;
}

最佳答案

更好的方法是拥有一个字符数组并生成一个随机数以从该数组中选择一个字符。通过这种方式,您可以获得“行为良好”的角色;或至少具有明确定义的不良字符。如果你真的想要所有 256 个字符(注意 8 位假设),那么创建一个包含 256 个条目的数组 ('a','b',....'\t','n'......)

这也是便携的

关于c++ - 在 C++ 中将 int 的最低有效位放入 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31486069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com