c++ - C 代码在查找时与 C++ 的行为不同

标签 c++ c

我有以下代码块(不是我写的),它执行映射并将 ASCII 字符重新编码为 EBCDIC。

// Variables.
CodeHeader* tchpLoc = {};
...
memset(tchpLoc->m_ucpEBCDCMap, 0xff, 256);
for (i = 0; i < 256; i++) {
    if (tchpLoc->m_ucpASCIIMap[i] != 0xff) {
        ucTmp2 = i;
        asc2ebn(&ucTmp1, &ucTmp2, 1);
        tchpLoc->m_ucpEBCDCMap[ucTmp1] = tchpLoc->m_ucpASCIIMap[i];
    }
}

CodeHeader定义是

typedef struct {
    ...
    UCHAR* m_ucpASCIIMap; 
    UCHAR* m_ucpEBCDCMap; 
} CodeHeader;

似乎给我带来问题的方法是

void asc2ebn(char* szTo, char* szFrom, int nChrs)
{
    while (nChrs--)
        *szTo++ = ucpAtoe[(*szFrom++) & 0xff];
}

[注意,把unsigned char数组ucpAtoe[256]复制到题尾,以供引用]。

现在,我有一个旧的 C 应用程序和我的 C++11 转换并排运行,这两个代码写了一个巨大的 .bin 文件,并且有一个微小的差异,我已经追踪到上面的代码。这两个代码发生的事情是 block

...
    if (tchpLoc->m_ucpASCIIMap[i] != 0xff) {
        ucTmp2 = i;
        asc2ebn(&ucTmp1, &ucTmp2, 1);
        tchpLoc->m_ucpEBCDCMap[ucTmp1] = tchpLoc->m_ucpASCIIMap[i];
    }

进入 i = 32 并且 asc2ebn 方法返回 ucTmp1 作为 64 '@' 对于 C 和 C++ 变体 很棒。下一个条目用于 i = 48,对于此值,asc2ebn 方法返回 ucTmp1 作为 240'ð' 并且 C++ 代码返回 ucTmp1 作为 -16'ð'。我的问题是,为什么此查找/转换对于相同的输入和查找数组(复制在下方)完全产生不同的结果?

在这种情况下,旧的 C 代码被认为是正确的,所以我希望 C++ 为这个查找/转换产生相同的结果。感谢您的宝贵时间。


static UCHAR ucpAtoe[256] = {
    '\x00','\x01','\x02','\x03','\x37','\x2d','\x2e','\x2f',/*00-07*/
    '\x16','\x05','\x25','\x0b','\x0c','\x0d','\x0e','\x0f',/*08-0f*/
    '\x10','\x11','\x12','\xff','\x3c','\x3d','\x32','\xff',/*10-17*/
    '\x18','\x19','\x3f','\x27','\x22','\x1d','\x35','\x1f',/*18-1f*/
    '\x40','\x5a','\x7f','\x7b','\x5b','\x6c','\x50','\xca',/*20-27*/
    '\x4d','\x5d','\x5c','\x4e','\x6b','\x60','\x4b','\x61',/*28-2f*/
    '\xf0','\xf1','\xf2','\xf3','\xf4','\xf5','\xf6','\xf7',/*30-37*/
    '\xf8','\xf9','\x7a','\x5e','\x4c','\x7e','\x6e','\x6f',/*38-3f*/
    '\x7c','\xc1','\xc2','\xc3','\xc4','\xc5','\xc6','\xc7',/*40-47*/
    '\xc8','\xc9','\xd1','\xd2','\xd3','\xd4','\xd5','\xd6',/*48-4f*/
    '\xd7','\xd8','\xd9','\xe2','\xe3','\xe4','\xe5','\xe6',/*50-57*/
    '\xe7','\xe8','\xe9','\xad','\xe0','\xbd','\xff','\x6d',/*58-5f*/
    '\x79','\x81','\x82','\x83','\x84','\x85','\x86','\x87',/*60-67*/
    '\x88','\x89','\x91','\x92','\x93','\x94','\x95','\x96',/*68-6f*/
    '\x97','\x98','\x99','\xa2','\xa3','\xa4','\xa5','\xa6',/*70-77*/
    '\xa7','\xa8','\xa9','\xc0','\x6a','\xd0','\xa1','\xff',/*78-7f*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*80-87*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*88-8f*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*90-97*/
    '\xff','\xff','\xff','\x4a','\xff','\xff','\xff','\xff',/*98-9f*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*a0-a7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*a8-af*/
    '\xff','\xff','\xff','\x4f','\xff','\xff','\xff','\xff',/*b0-b7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*b8-bf*/
    '\xff','\xff','\xff','\xff','\xff','\x8f','\xff','\xff',/*c0-c7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*c8-cf*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*d0-d7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*d8-df*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*e0-e7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff',/*e8-ef*/
    '\xff','\xff','\xff','\x8c','\xff','\xff','\xff','\xff',/*f0-f7*/
    '\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff' };

最佳答案

在 C 和 C++ 中,标准不要求 charsignedunsigned 类型。它是实现定义的,显然,您的 C 编译器将 char 确定为 unsigned char,而您的 C++ 编译器将其确定为 signed char

对于 GCC,使 char 成为 unsigned char 的标志是 -funsigned-char。对于 MSVC,它是 /J

关于c++ - C 代码在查找时与 C++ 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24680608/

相关文章:

c++ - 使用四元数防止绕特定轴旋转

c++ - 3D 顶点类或结构

容器化 Linux 环境中的 C++ : why does attempting to allocate large vector causes SIGABRT or neverending loop instead of bad_alloc?

使用 _stscanf_s C 库函数转换成功,但实际上失败

c++ - OpenGL在绘制三角形时只有黑屏

c++ - linux-aio 可以进行类似 sendfile() 的操作吗?

c - C语言中如何实现同时输入和输出?

使用库优化 C 链接器

有人可以用最简单的术语解释什么是 "for"循环吗?

c++ - 链表重载运算符 = 运行时错误