- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
#include <stdio.h>
#include <stdint.h>
int main(void)
{
size_t foo = -5;
uint8_t foo1 = -5;
printf("%d %d", foo, foo1);
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−50
#include <stdio.h>
#include <stdint.h>
int main(void)
{
size_t foo = -5;
uint8_t foo1 = -5;
printf("%d %d", foo, foo1);
return 0;
}
А почему лыжи не едут? size_t же ведь беззнаковый.
З.Ы. и да мне стыдно
Но все равно не совсем догнал size_t он в stdint. h разве не как max unsigned представлен?
И да, size_t нужен для хранения индексов, то-бишь его размер на x86 будет 32 бита, а на x64 - 64, емнип.
Также в гцц
float кастится в double. целочисленые типы кастятся в int/long.
теперь. foo = 0xfffffffffffffffbU, foo1 = 0xfbU. foo при касте может только максимум обрезатся. foo1 - будет добито нулями и станет 0x000000000000000fb.
то что здесь не происходит и о чём знать стоит, это sign extension. если бы foo1 был знаковым, то вместо добивания нулями (беззнаковое расширение), происходило бы знаковое расширение: "растягивание" (extension) самого верхнего (== знакового) бита в новые байты.
[unsigned/signed] short/char promoted to int. Остальное (long/long long) передаётся как есть. Есть даже спецификатор для long long в printf.
так что по идее должно быть sizeof(unsigned)
Не должно быть. Размер unsigned - ID.
> Вопрос то в другом, почему uint8_t через тот же формат %d распознается как unsigned, а size_t пишет -5, как signed
Ничего там не "распознается". Срочно гугли представление отрицательных чисел в памяти.