غريب السلوك التحول قليلا
-
03-07-2019 - |
سؤال
وأنا في عملية ترقية بعض التعليمات البرمجية ANSI C ++ إلى C # ... وهذا هو قتل لي في الوقت الحالي.
ولقد value = 6844268
كل الاختبارات.
ورمز اختبار:
value >> 12
value & 0x00000FFF
وC ++ يعود 18273 و29497، في حين C # 1670 عوائد و3948. لقد حاولت كل ما يمكن الجمع بين أنواع في C # (كثافة العمليات، UINT، طويلة، ULONG، Int64 ...)، ولكن لا تذهب: (
وقيمة الأصل في C ++ هو صحيح غير الموقعة. أي شخص لديه أي أفكار؟
وتحرير: أرغ، افسدت أنا في بلدي التصحيح. أبحث في مجموعة [قيمة] بدلا من القيمة. بلدي سيئة.
المحلول
وافحص C ++ تعريفات رمز المشغل >>
يتم تجاوز ربما؟
وC # يتم احتساب القيم الصحيحة، وكنت على الاطلاق 100٪ على يقين من القيم الخاصة بك هي ما تقوله هم؟
وفقط للذهاب من خلال الاقتراحات:
6844268 = 11010000110111101101100
>> 12 = 11010000110.111101101100
result = 11010000110
result = 2 + 4 + 128 + 512 + 1024 = 1670
18273 = 100011101100001
6844268 >> 12 = 11010000110
^^^^ ^^^ <-- mismatches
وأنها لا أصطف، يجب أن يكون هناك بعض التفاصيل التي لم تكن رؤية في التعليمات البرمجية هناك.
نصائح أخرى
وأنا لا أعرف ما هو C ++ حتى، ولكن في بلدي آلة حاسبة # القيم C صحيحة. هو هذا ربما مشكلة تمديد علامة (قيمة C ++ هو سلبي، والتحول يجر أعلى 1 بت مع ذلك؟)
وأيضا، نظرا إلى أن 0xFFF هو 4095، لا توجد وسيلة لوعملية يمكن إرجاع قيمة أكبر من ذلك.
ويبدو الصحيح بالنسبة لي ...
sock@thebrain:~$ g++ test.cc
sock@thebrain:~$ ./a.out
6844268 1670 1670
6844268 1670 1670
sock@thebrain:~$ cat test.cc
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
unsigned int value = 6844268;
printf("%u %u %u\n", value, value >> 12, (value >> 12)&0xFFF);
cout << value << " ";
cout << (value>>12) << " ";
value = (value>>12)&0xFFF;
cout << value << endl;
return 0;
};
ولا متجاوزة مشغل >>. هذا مقتطف شفرة C ++ ذات الصلة:
[Function signature: const unsigned char *src, int len, char *dst]
unsigned short *sdst = (unsigned short*) dst;
unsigned short *slt = (unsigned short*) lookup_ext;
while (len >= 3) {
unsigned int value = *src++ << 16;
value |= *src++ << 8;
value |= *src++;
cout << value << endl;
*sdst++ = slt[value >> 12];
*sdst++ = slt[value & 0x00000FFF];
cout << sizeof(unsigned short) << endl << slt[value >> 12] << endl << slt[value & 0x00000FFF] << endl;
len -= 3;
}
وcout وأضاف لتصحيح الأخطاء الذئب السياج.
والإخراج cout:
6844268 | cout << value
2 | sizeof(unsigned short)
18273 | slt... Ohhhh sneaky. I mis-pasted that, nevermind - it's an slt issue [Output's the same now]
29497