Я новичок в C и видел такой код, как (unsigned)b
Кастинг подразумеваемый беззнаковый целочисленный тип?
Означает ли это, что b будет беззнаковым int? Или какой тип это подразумевает?
Я новичок в C и видел такой код, как (unsigned)b
Кастинг подразумеваемый беззнаковый целочисленный тип?
Означает ли это, что b будет беззнаковым int? Или какой тип это подразумевает?
b
будет любым типом, с которого он должен был начаться. Это не меняет
(unsigned)b
будет оценить, как любое значение b
есть, но подлежит к отливать к unsigned
, который является синонимом unsigned int
.
Как это происходит полностью зависит от типа b
, чтобы начать с, является ли конвертируемым в unsigned int
того типа, и падает ли значениесодержащегося в нем невредимом между 0...UINT_MAX
или нет.
Ex:
#include <stdio.h>
void foo(unsigned int x)
{
printf("%u\n", x);
}
int main()
{
int b = 100;
foo((unsigned)b); // will print 100
char c = 'a';
foo((unsigned)c); // will print 97 (assuming ASCII)
short s = -10; // will print 4294967286 for 32-bit int types
// (see below for why)
foo((unsigned)s);
// won't compile, not convertible
//struct X { int val; } x;
//foo((unsigned)x);
}
Единственная часть этого, что может поднять глаз бровь является третьим примером. Когда значение типа конвертируемого типа без знака выходит из диапазона без знака (ex: отрицательные значения не являются одинаковыми значениями, представляемыми с любыми типамиunsigned
), значение преобразуется путем многократного добавления максимального значения, представляемого посредством неподписанный целевой плюс-один до значения вне диапазона до тех пор, пока он не попадет в допустимый диапазон неподписанного типа.
Другими словами, потому что -10
не в допустимом представлении unsigned int
, UINT_MAX+1
добавляется -10
раз (принимает только один раз в данном случае), пока результат не будет в 0...UINT_MAX
.
Надеюсь, что это поможет.
unsigned
короткие из unsigned int
signed
короткие из signed int
long
является коротким из long int
long long
является коротким из long long int
short
является коротким из short int
'char' не является модификатором - нет такой вещи, как' char int'. – sepp2k
Oups..I исправил его !! Спасибо @ sepp2k! –
Я думаю, что ОП спрашивал о значении литого оператора. –
Возможный дубликат [что такое неподписанный тип данных?] (Http://stackoverflow.com/questions/1171839/what-is-the-unsigned-datatype) – horns
'b' может быть одного из многих разных типов. Результат '(unsigned) b' будет' unsigned' AKA 'unsigned int'. – chux