2015-01-19 2 views
1

Я новичок в C и видел такой код, как (unsigned)bКастинг подразумеваемый беззнаковый целочисленный тип?

Означает ли это, что b будет беззнаковым int? Или какой тип это подразумевает?

+1

Возможный дубликат [что такое неподписанный тип данных?] (Http://stackoverflow.com/questions/1171839/what-is-the-unsigned-datatype) – horns

+0

'b' может быть одного из многих разных типов. Результат '(unsigned) b' будет' unsigned' AKA 'unsigned int'. – chux

ответ

3

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.

Надеюсь, что это поможет.

1

unsigned короткие из unsigned int

signed короткие из signed int

long является коротким из long int

long long является коротким из long long int

short является коротким из short int

+0

'char' не является модификатором - нет такой вещи, как' char int'. – sepp2k

+0

Oups..I исправил его !! Спасибо @ sepp2k! –

+0

Я думаю, что ОП спрашивал о значении литого оператора. –

Смежные вопросы