- 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 же ведь беззнаковый.
З.Ы. и да мне стыдно
guest 31.05.2016 13:08 # +5
MiD 31.05.2016 13:11 # 0
guest 31.05.2016 13:19 # 0
MiD 31.05.2016 13:21 # 0
kurwa-nextgen 31.05.2016 13:29 # 0
MiD 31.05.2016 13:32 # 0
Но все равно не совсем догнал size_t он в stdint. h разве не как max unsigned представлен?
guest 31.05.2016 13:41 # +3
gost 31.05.2016 13:57 # +1
И да, size_t нужен для хранения индексов, то-бишь его размер на x86 будет 32 бита, а на x64 - 64, емнип.
MiD 31.05.2016 13:59 # 0
guest 31.05.2016 14:15 # +1
guest 31.05.2016 14:18 # +2
guest 31.05.2016 14:21 # +2
Также в гцц
Dummy00001 31.05.2016 14:23 # +3
float кастится в double. целочисленые типы кастятся в int/long.
теперь. foo = 0xfffffffffffffffbU, foo1 = 0xfbU. foo при касте может только максимум обрезатся. foo1 - будет добито нулями и станет 0x000000000000000fb.
то что здесь не происходит и о чём знать стоит, это sign extension. если бы foo1 был знаковым, то вместо добивания нулями (беззнаковое расширение), происходило бы знаковое расширение: "растягивание" (extension) самого верхнего (== знакового) бита в новые байты.
MiD 31.05.2016 14:27 # +1
Soul_re@ver 31.05.2016 19:28 # 0
[unsigned/signed] short/char promoted to int. Остальное (long/long long) передаётся как есть. Есть даже спецификатор для long long в printf.
Dummy00001 31.05.2016 21:00 # 0
TarasB 31.05.2016 14:41 # +3
MiD 31.05.2016 13:56 # 0
так что по идее должно быть sizeof(unsigned)
gost 31.05.2016 14:30 # 0
Не должно быть. Размер unsigned - ID.
> Вопрос то в другом, почему uint8_t через тот же формат %d распознается как unsigned, а size_t пишет -5, как signed
Ничего там не "распознается". Срочно гугли представление отрицательных чисел в памяти.