Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
C++
#1
Делать было нечего, забавы ради решил немного поковыряться...
[Изображение: _INDxB6JoP8.jpg]
если первые 2 случая более менее поддаются логике, то что происходит в последнем ? Smile
Ответ
#2
oSg Написал:Делать было нечего, забавы ради решил немного поковыряться...
[Изображение: _INDxB6JoP8.jpg]
если первые 2 случая более менее поддаются логике, то что происходит в последнем ? Smile

вот это ты психанул.
Ответ
#3
Зачем вы пишете signed? По умолчанию все знаковое.
В последнем случае вы получаете размерность типа вашей переменной, как и раньше, даром что тип вы объявили тоже знаковый - для беззнака умножайте предел на два.

Добавлено через 1 минуту
Все прекрасно поддается логике. Даже ваше !test2 - это булева переменная. А в Си, все что не 0, то True, даже отрицательные значения. 0, в свою очередь, False.
Ответ
#4
Zeratyl Написал:Зачем вы пишете signed? По умолчанию все знаковое.
В последнем случае вы получаете размерность типа вашей переменной, как и раньше, даром что тип вы объявили тоже знаковый - для беззнака умножайте предел на два.

Добавлено через 1 минуту
Все прекрасно поддается логике. Даже ваше !test2 - это булева переменная. А в Си, все что не 0, то True, даже отрицательные значения. 0, в свою очередь, False.
а вы попробуйте скомпилить следующий код, без signed Smile
Код:
signed void test3() {
    return -10;
}
ну или, например, объявить переменную void test2 (подчеркиваю, что не void*)
далее - (un)signed void и (un)signed bool это обыкновенные инты (с высокой вероятностью)
и напоследок: вопрос был про третий случай, а именно - что происходит с sizeof
Ответ
#5
oSg Написал:вопрос был про третий случай

oSg Написал:что происходит в последнем ?

:ec:

Да ради бога, только вы просто используете приведение типов. Могли бы просто писать int и не делать комедию.
Ответ
#6
Zeratyl Написал::ec:

Да ради бога, только вы просто используете приведение типов. Могли бы просто писать int и не делать комедию.

прошу, объясните мне результат sizeof(test5) в обоих случаях
а то у меня возникают большие сомнения про int и привидение типов (применительно к test5)
Ответ
#7
oSg, советую проштудировать спецификацию языка, обычно там можно получить ответ на любой вопрос.
Ответ
#8
А вы напишите sizeof(__int64), что он скажет?
Ответ
#9
Zeratyl Написал:А вы напишите sizeof(__int64), что он скажет?

явно не 10563636 Smile

на самом деле, непонятно следующее:
Код:
__int64 test5 = 0;
printf("%d \t %d\r\n", *(&test5+1), sizeof(test5));
Код:
; 18   :     __int64 test5 = 0;
; 19   :     printf("%d \t %d\r\n", *(&test5+1), sizeof(test5));

    push    8
    push    DWORD PTR _test5$[ebp+12]
    push    DWORD PTR _test5$[ebp+8]
    push    OFFSET ??_C@_09JAJOBGPP@?$CFd?5?7?5?$CFd?$AN?6?$AA@
    call    esi
в esi у нас, собственно, printf
херня с символами - формат
а вот что за последних два push'a...
Ответ
#10
проблема у вас не в sizeof а в том что вы передаете в printf переменную типа int64 а спецификатор используете %d

измените его на %I64d
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)