Я пытаюсь объединить символы строки, но вместо этого получаю числовые значения. Почему это так?
С#
using System;
namespace std {
class Program {
static void Main(string[] args) {
string n = "helloWorld!";
Console.WriteLine(n[0] + n[1] + n[2] + n[3] + n[4] + n[5]);
}
}
}
С++
#include <iostream>
using namespace std;
int main() {
string x = "helloWorld!";
cout << x[0] + x[1] + x[2] + x[3] + x[4] + x[5] << endl;
return 0;
}
Вывод (оба языка) -
619
Ожидаемый результат -
helloW
@Soleil-MathieuPrévot Что, если я буду использовать символы вместо целых чисел? Я знаю, что это сбивает с толку, но возможно ли это?
Ну, похоже, вы пытаетесь использовать синтаксис Python в контексте С++/С# (он делает что-то еще). Попробуйте это, чтобы преобразовать массив байтов в другой тип (int, long, long long): template<class T> T ToType(const byte* x) { T value{}; for (int i = 0; i < sizeof T; i++) value += ((long)x[i] & 0xffL) << 8 * i; return value; }
. Вы используете это так: ToType<long long>(charArray)
с unsigned char* charArray[someSize]
В общем, как и в математике, вы хотите знать, что именно делает функция +. Его определение может отличаться от обычного (из арифметики Пеано), оно не является абелевым в языках программирования, в питоне оно объединяет аргументы, когда они являются строкой, здесь оно выполняет некоммутативное сложение.
Все x[i]
символы. Char хранит числовое значение, представляющее символ в зависимости от используемой кодировки. Когда вы делаете x[i] + x[j]
, вы не объединяете их, вы просто добавляете их числовые значения.
Если вы хотите конкатенировать, вам придется использовать строки.
Ну, у вас также есть переполнение типа (byte или char не может выйти за пределы 255 = 0xff) и неявное приведение к большему типу (int имеет максимальное значение 0xffffffff), потому что 619 не может быть представлено с помощью char/byte. Однако вы можете сгруппировать «ад», «oWor» и т. д. из массива строк с 4 символами (4 * 32 бита) в массив int (1 * 32 бита) и отобразить эти числа.