C代码在查找方面与c++不同
C Code Acting Differently to C++ on Lookup
我有以下代码块(不是我写的),它执行映射并将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文件,并且有一个微小的差异,我已经跟踪到上面的代码。这两个代码的情况是
块...
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++变体 great。下一项是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++中,标准不要求char
是signed
或unsigned
类型。它是实现定义的,显然,你的C编译器决定char
是unsigned char
,而你的c++编译器决定它是signed char
。
对于GCC,使char
变为unsigned char
的标志是-funsigned-char
。对于MSVC,它是/J
。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 从不同线程使用int64的不同字节安全吗
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 函数向量_指针有不同的原型,我可以构建一个吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 访问者访问变体并返回不同类型时出错
- #为""定义宏;静态";针对不同的上下文
- 不同翻译单元中不可重载的非内联函数定义
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过继承类使用来自不同命名空间的运算符
- 我想做一个彼此不同但重复出现的数字
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- c++类声明时,相同的例程,不同的成员变量类型
- Python中的for循环与C++有何不同
- 为测试目标创建具有不同源文件夹的文件
- 不同语言中相同代码的不同行为