Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
Делать было нечего, забавы ради решил немного поковыряться...
![[Изображение: _INDxB6JoP8.jpg]](http://cs409320.vk.me/v409320172/41cf/_INDxB6JoP8.jpg)
если первые 2 случая более менее поддаются логике, то что происходит в последнем ?
Сообщений: 526
Тем: 28
Зарегистрирован: Oct 2009
Репутация:
7,209
oSg Написал:Делать было нечего, забавы ради решил немного поковыряться...
![[Изображение: _INDxB6JoP8.jpg]](http://cs409320.vk.me/v409320172/41cf/_INDxB6JoP8.jpg)
если первые 2 случая более менее поддаются логике, то что происходит в последнем ? 
вот это ты психанул.
Сообщений: 1,607
Тем: 78
Зарегистрирован: Feb 2011
Репутация:
13,414
10-12-2013, 09:19 PM
(Сообщение последний раз редактировалось: 10-12-2013, 09:24 PM Zeratyl.)
Зачем вы пишете signed? По умолчанию все знаковое.
В последнем случае вы получаете размерность типа вашей переменной, как и раньше, даром что тип вы объявили тоже знаковый - для беззнака умножайте предел на два.
Добавлено через 1 минуту
Все прекрасно поддается логике. Даже ваше !test2 - это булева переменная. А в Си, все что не 0, то True, даже отрицательные значения. 0, в свою очередь, False.
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
Zeratyl Написал:Зачем вы пишете signed? По умолчанию все знаковое.
В последнем случае вы получаете размерность типа вашей переменной, как и раньше, даром что тип вы объявили тоже знаковый - для беззнака умножайте предел на два.
Добавлено через 1 минуту
Все прекрасно поддается логике. Даже ваше !test2 - это булева переменная. А в Си, все что не 0, то True, даже отрицательные значения. 0, в свою очередь, False. а вы попробуйте скомпилить следующий код, без signed
Код: signed void test3() {
return -10;
}
ну или, например, объявить переменную void test2 (подчеркиваю, что не void*)
далее - (un)signed void и (un)signed bool это обыкновенные инты (с высокой вероятностью)
и напоследок: вопрос был про третий случай, а именно - что происходит с sizeof
Сообщений: 1,607
Тем: 78
Зарегистрирован: Feb 2011
Репутация:
13,414
oSg Написал:вопрос был про третий случай
oSg Написал:что происходит в последнем ?
:ec:
Да ради бога, только вы просто используете приведение типов. Могли бы просто писать int и не делать комедию.
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
Zeratyl Написал::ec:
Да ради бога, только вы просто используете приведение типов. Могли бы просто писать int и не делать комедию.
прошу, объясните мне результат sizeof(test5) в обоих случаях
а то у меня возникают большие сомнения про int и привидение типов (применительно к test5)
Сообщений: 437
Тем: 7
Зарегистрирован: May 2011
Репутация:
2,580
oSg, советую проштудировать спецификацию языка, обычно там можно получить ответ на любой вопрос.
Сообщений: 1,607
Тем: 78
Зарегистрирован: Feb 2011
Репутация:
13,414
А вы напишите sizeof(__int64), что он скажет?
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
Zeratyl Написал:А вы напишите sizeof(__int64), что он скажет?
явно не 10563636
на самом деле, непонятно следующее:
Код: __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...
Сообщений: 526
Тем: 28
Зарегистрирован: Oct 2009
Репутация:
7,209
проблема у вас не в sizeof а в том что вы передаете в printf переменную типа int64 а спецификатор используете %d
измените его на %I64d
|