Я получаю этот вывод:
char c = 123456;
cout << c << endl;
warning: implicit conversion from 'int' to 'char' changes value from 123456 to 64 [-Wconstant-conversion]
char c = 123456;
~ ^~~~~~
1 warning generated.
char
имеет размер 1 байта в C++ и имеет диапазон -128..127 (со знаком) и 0..255 (без знака), поэтому, насколько я понимаю, в нем нельзя хранить 123456. Но как компилятор преобразует 123456 в символ 64, который является ASCII '@'
.
Я ожидал, что он выдаст ошибку или преобразует его, но я не могу понять это преобразование.
Добро пожаловать в Stack Overflow! Пожалуйста, публикуйте свой код/ошибки в виде текста, а не изображений. Для людей, которые по той или иной причине не видят изображения, ваш вопрос остается без ответа. Мы также не можем копировать текст с изображений, что не позволяет нам отлаживать ваш код, то есть помогать вам.
Что такое 123456 % 256
?
Вы не получите ошибку, но получите предупреждение о преобразовании. Этого должно быть достаточно. В сообщении даже указывается значение, которое оно будет использовать.
Однако при этом вы получаете сообщение об ошибке char c{123456};
: https://ideone.com/1VD5fD
Если преобразовать десятичное число 123456
в шестнадцатеричное, вы получите 1E240
.
char
, размер которого составляет всего 1 байт (8 бит для всех интересных на данный момент машин), может хранить 2 шестнадцатеричные цифры (1 шестнадцатеричная цифра равна 4 битам, поэтому 8 бит занимают 2 цифры).
Таким образом, присвоение слишком большого 1E240
одному char
оставит шестнадцатеричное 40
в этом char
-байте. Переполнения в компьютерном программном обеспечении (как правило) отбрасывают левые цифры и сохраняют только то, что подходит справа.
Посмотрите, что шестнадцатеричный 40
в ASCII-таблицах (или преобразуйте в десятичный 64
и затем найдите его), показывает, что это символ @
.
Опять же, почему ASCII? На нем построены все «соответствующие» кодировки, поэтому я даже не спрашиваю, что использует ваш компьютер, потому что это наверняка какая-то производная от ASCII...
Это приводит к вопросу: «Что такое интеграл ASCII?»
Во-первых, почему ты отметил
dsa
? Вы читали, для чего нужен тегdsa
? Во-вторых, почему так много компьютерных языков? Пожалуйста, отметьте один язык.