Saferoll писал(а):
Верно ли я понял, что "(unsigned)a" - это "(unsigned int)a" независимо от типа этого а. А для короткого и длинного надо писать тоже конкретно "(unsigned short)a" и "(unsigned long)a"?
Мне всегда казалось, что unsigned — это приведение к беззнаковому с сохранением той же разрядности. Для проверки написал такой код:
Код: "C"
#include "SYSTEM.h"
#include "Console.h"
export main(int argc, char **argv)
{
signed char schar;
signed short int sint;
Console_WriteStr((CHAR*)"sizeof(signed char) = ", 0);
Console_WriteInt(sizeof(schar));
Console_WriteLn();
Console_WriteStr((CHAR*)"sizeof((unsigned)signed char) = ", 0);
Console_WriteInt(sizeof((unsigned)schar));
Console_WriteLn();
Console_WriteStr((CHAR*)"sizeof(signed short int) = ", 0);
Console_WriteInt(sizeof(sint));
Console_WriteLn();
Console_WriteStr((CHAR*)"sizeof((unsigned)signed short int) = ", 0);
Console_WriteInt(sizeof((unsigned)sint));
Console_WriteLn();
}
Результат оказался таким:
sizeof(signed char) = 1
sizeof((unsigned)signed char) = 4
sizeof(signed short int) = 2
sizeof((unsigned)signed short int) = 4
Значит да, обычный unsigned — это unsigned int (можно опускать int), а вовсе не то, что я думал. Приведение других типов надо описывать полностью, без упущений. Вобщем-то это не очень логично, как и много чего в Си.
Saferoll писал(а):
Можно ли в С как-то написать универсальное приведение к беззнаковому "(unsigned ???)a" , где компилятор сам подставит ??? чтобы длина целого не менялась?
Да, видимо, можно. Это будет хитрый макрос вида:
Код: "C"
#define UNI_UNSIGNED(i) ( sizeof(i)==1 ? (unsigned char)i : \
( sizeof(i)==2 ? (unsigned short int)i : \
( sizeof(i)==4 ? (unsigned int)i : \
(unsigned long)i )))
Я его потестил, но он не работает (всё равно возвращает размер 4 для всех типов). Надо консультироваться с опытными сишниками.
Saferoll писал(а):
А если нет, то как нам организовать динамическое беззнаковое деление? Завести #define __UDIVint(a, b), #define __UDIVshort(a, b) и #define __UDIVlong(a, b) чтобы Ofront генерировал в создаваемую С-программу конкретную операцию беззнакового деления, в зависимости от типа переменной цикла?
Гм, гм. Наверное это простое решение. Но вроде бы не очень элегантное, да?
Задача поставлена, будем думать ещё.