Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. Лонг побитно получился такой: Код: plaintext 1. Ну да, знаковое в беззнаковое конвертировать -- это конечно ербалайство, спору нет. Но всё равно интересно, как оно внутри так устроено, что так получается? Ведь если сделать unsigned char = char, то получилось бы 128, зачем в лонге единицы появились? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 07:00 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513, На самом деле в p лежит число -128, потому что сработало приведение типов при присвоении (константа 128 не помещается в допустимый диапазон для signed char). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 12:14 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513зачем в лонге единицы появились? Расширение знака. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 13:09 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
RWolfjsa54513, На самом деле в p лежит число -128, потому что сработало приведение типов при присвоении (константа 128 не помещается в допустимый диапазон для signed char). Это понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 14:36 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovjsa54513зачем в лонге единицы появились? Расширение знака. А зачем? Что за тупая операция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 14:36 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Затем, чтобы расширение знакового числа от меньшего к большему давало правильный результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 15:17 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЗатем, чтобы расширение знакового числа от меньшего к большему давало правильный результат. Так и получился неправильный результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 16:14 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Это как считать. Если беззнаковый байт со значением 128 рассматривать как знаковый, то получается -128. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 16:18 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513Так и получился неправильный результат. А не надо было впихивать в char то, что в него не помещается :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 16:39 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513, Смотри, ты записал в signed char число -128. После этого ты присвоил его переменной unsigned long (диапазон допустимых значений 0…2 63 -1). Как компилятор должен обработать такой ход? Он поступает так: расширяет разрядность источника до 8 байт (диапазон -2 62 …2 62 -1), после чего забывает про знак, вот и получилось число с кучей единиц в старших битах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2014, 16:51 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513 Ну да, знаковое в беззнаковое конвертировать -- это конечно ербалайство, спору нет. Стандартом описано поведение в данном конкретном случае, и это не то слово что вы написали. Вообще говоря, Anatoly Moskovsky дал вам уже правильный ответ. Вы записали 128 в plain char, т.о. старший бит установили в 1, получите -128. Далее, если бы вы открыли стандарт языка Си, вы бы увидели в главе 6.3 Conversions следующее ISO/IEC 9899:201x6.3 Conversions 1 Several operators convert operand values from one type to another automatically. This subclause specifies the result required from such an implicit conversion, as well as those that result from a cast operation (an explicit conversion). The list in 6.3.1.8 summarizes the conversions performed by most ordinary operators; it is supplemented as required by the discussion of each operator in 6.5. 2 Conversion of an operand value to a compatible type causes no change to the value or the representation. Forward references: cast operators (6.5.4). и немного ниже ISO/IEC 9899:201x6.3.1.3 Signed and unsigned integers 1 When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged. 2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.60) 3 Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised. Думаю, в вашем случае нужно использовать пункт 2. PS Хотя, считаю что вашем случае, нужно остановиться на том, что вы записали в plain char 128. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 03:02 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
RWolfjsa54513, Смотри, ты записал в signed char число -128. После этого ты присвоил его переменной unsigned long (диапазон допустимых значений 0…2 63 -1). Как компилятор должен обработать такой ход? Он поступает так: расширяет разрядность источника до 8 байт (диапазон -2 62 …2 62 -1), после чего забывает про знак, вот и получилось число с кучей единиц в старших битах. Спасибо, я понял. Ключевой момент: он расширяет ещё до убирания знака. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 03:59 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513RWolfjsa54513, Смотри, ты записал в signed char число -128. После этого ты присвоил его переменной unsigned long (диапазон допустимых значений 0…2 63 -1). Как компилятор должен обработать такой ход? Он поступает так: расширяет разрядность источника до 8 байт (диапазон -2 62 …2 62 -1), после чего забывает про знак, вот и получилось число с кучей единиц в старших битах. Спасибо, я понял. Ключевой момент: он расширяет ещё до убирания знака. никакого убирания знака не происходит в принципе. Ни до, ни после, ни вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 04:15 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
jsa54513, сегодня утром я разминался, и решал простую задачу . Посмотрите пожалуйста на код ниже. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Как вы считаете, есть ли в нём ошибка(в выделенных строчках), что будет отправлено на поток вывода, и почему ? На вход отправим 7 и 2, например. (также, я вас не прошу, но не буду возражать, если вы предложите оптимальный алгоритм,) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 07:02 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryjsa54513, сегодня утром я разминался, и решал простую задачу . Посмотрите пожалуйста на код ниже. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Как вы считаете, есть ли в нём ошибка(в выделенных строчках), что будет отправлено на поток вывода, и почему ? На вход отправим 7 и 2, например. (также, я вас не прошу, но не буду возражать, если вы предложите оптимальный алгоритм,) Ошибка есть. Формат в printf должен соответствовать типу и размеру данных, передаваемых в соотв. параметре, либо нужно при передачи делать явное преобразование данных. Код: plaintext 1. 2. 3. Что будет отправлено в поток вывода, если это не сделать, не определено языком, а по сути в зависимости от endianness будет напечатана какая-то часть байтов числа в виде целого со знаком, либо если переданное меньше по размеру -- какой-то случайный мусор в виде числа, т.е. просто будет напечатана какая-то хрень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 14:55 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
В моём случае res напечатался нормально, а вот вместо n выводился 0. Это в первой строчке. А во второй всё нормально (касаемо вывода) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:59 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Потому уточню, это undefined behaviour или implementation-defined behavior ? (стандарта нет под рукой) То что проблема в том, что неправильно указан спецификатор вывод я понял. Далее, мне казалось, что в первом случае переменная res затирает "значение" n "непрочитанными байтами". Но моё объяснение не совпадает с вашим, потому видимо я ошибаюсь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:04 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВ моём случае res напечатался нормально, а вот вместо n выводился 0. Это в первой строчке. А во второй всё нормально (касаемо вывода) "res напечатался нормально" -- это частный случай более общего "напечатает какую-то хрень". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:49 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Это undefined behaviour ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:50 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПотому уточню, это undefined behaviour или implementation-defined behavior ? (стандарта нет под рукой) То что проблема в том, что неправильно указан спецификатор вывод я понял. Далее, мне казалось, что в первом случае переменная res затирает "значение" n "непрочитанными байтами". Но моё объяснение не совпадает с вашим, потому видимо я ошибаюсь В общем случае технически что происходит -- при вызове в стек кладутся одна за другой две переменные (значения их, естественно), двух типов (в соотсветствии с объявлением переменных), одна за другой, в порядке, определённом соглашением о вызовах. Затем printf этот набор байт из содержимого двух переменных (и возможно байт для выравнивания между ними) интерпретируется в соответствии с соглашением о вызовах функций и типами параметров, указанных в форматной строке, и оттуда выуживаются значения для подстановки в формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 17:02 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
MasterZivSashaMercuryПотому уточню, это undefined behaviour или implementation-defined behavior ? (стандарта нет под рукой) То что проблема в том, что неправильно указан спецификатор вывод я понял. Далее, мне казалось, что в первом случае переменная res затирает "значение" n "непрочитанными байтами". Но моё объяснение не совпадает с вашим, потому видимо я ошибаюсь В общем случае технически что происходит -- при вызове в стек кладутся одна за другой две переменные (значения их, естественно), двух типов (в соотсветствии с объявлением переменных), одна за другой, в порядке, определённом соглашением о вызовах. Затем printf этот набор байт из содержимого двух переменных (и возможно байт для выравнивания между ними) интерпретируется в соответствии с соглашением о вызовах функций и типами параметров, указанных в форматной строке, и оттуда выуживаются значения для подстановки в формат. Примерно так я и представлял. В моём случае res помещалось в 4 байта, потому чтение/вывод в поток произошли нормально.(как вы выше сказали, это всего-лишь частный случай), далее при чтение следующих 4 байт, была прочитана не память n, а был затронут остаток непрочитанных байт от res. Вот так я думал. Такое поведение возможно ? А во втором случае, такого не происходит, потому что первой читается n, а уже потом res ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 01:53 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПримерно так я и представлял. В моём случае res помещалось в 4 байта, потому чтение/вывод в поток произошли нормально.(как вы выше сказали, это всего-лишь частный случай), далее при чтение следующих 4 байт, была прочитана не память n, а был затронут остаток непрочитанных байт от res. Вот так я думал. Такое поведение возможно ? Только уточнение. long long (значит и res) занимает 8 байтов. int занимает 4 байта. Для printf (как и для любых других функций с ... в прототипе) передача параметром long long выглядит так же как и передача двух int. Причем порядок в котором она видит эти два виртуальных int зависит от порядка байтов/слов платформы. На интеле (little-endian) младшая половина res будет первым, старшая - вторым. На других платформах может быть по-другому. Кроме того надо понимать, что printf в принципе не может определить количество и размер переданных параметров. Поэтому она смотрит на строку формата, а про следующие параметры, неописанные в формате она ничего не знает и игнорирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 02:46 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Хорошо у меня оставался только вопрос, как он читает, слева направо, или наоборот, вы на него уже ответили :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 06:50 |
|
||
|
Почему странный результат при конвертации unsigned long x = (char)(128)?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, причём когда столкнулся с этой проблемой, то сначала разобрался в ней(первоначально я не понял в чём дело), а уже потом рассказал про неё :) PS Правда я думал что это будет больше интересно автору топика, он ведь разбирался в типом данных long, а он куда-то пропал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 07:04 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38798018&tid=2019244]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 332ms |
| total: | 496ms |

| 0 / 0 |
