2010-11-28 3 views
0

Каким образом borland отличается от unsigned int?Borland C/C++ cast short to unsigned int

#include <stdio.h> 

void main() { 
    short sNum = 57000; 
    unsigned short usNum = sNum; 
    unsigned int uiNum; 

    printf("\r\nsNum = %d", sNum); 
    printf("\r\nusNum = %u", usNum); 

    //cast 1: short -> unsigned int 
    uiNum = sNum; 
    printf("\r\nuiNum = %u", uiNum); 

    //cast 2: unsigned short -> unsigned int 
    uiNum = (unsigned short)sNum; 
    printf("\r\nuiNum = %u", uiNum); 
} 

дает мне выход:

sNum = -8536 
usNum = 57000 
uiNum = 4294958760 
uiNum = 57000 

Почему я не получаю 57000 в гипсе 1: короткое замыкание на неподписанные Int (? Не существует никакого неявного приведения к беззнаковым незадолго до броска к неподписанным Int)?

ответ

0

Потому что вы попросили напечатать знаковое целое с

printf("\r\nsNum = %d", sNum); 

линии. Переменная была расширена знаком до int и передана как функция int в функцию printf, которая интерпретировала этот параметр как int.

Если вы сделали

printf("\r\nsNum = %u", sNum); 

вы получите 57000

+0

Ok тот аргумент, но проблема в том, когда вы используете переменную с другими подписанными переменных, значение -8536 используется. – harry 2010-11-28 12:31:34

+0

Нет, во втором случае вы получите неопределенное поведение для передачи неправильного типа `printf`. (Технически я считаю, что вы можете передать `int` вместо` unsigned`, если значение положительное, так как представления должны быть одинаковыми, но здесь `int` вы проходите (повышаемое значение` sNum `) отрицательный.) Я не вижу, чтобы он мог печатать 57000, если` int` и `short` не имеют одинакового размера. – 2010-11-28 13:22:48

0

Вы помещаете в SNUM значение вне диапазона колебаний Шорт. То, что вы получаете, является целым числом -8536, которое преобразуется в int, а затем в unsigned int, это 4294958760.

Вам необходимо либо объявить sNum как unsigned short (чтобы он мог сохранить нужное значение) преобразовать его в int вместо unsigned int.

1

Нет, нет никакого неявного приведения в неподписанный короткий перед тем, как отличить от неподписанного int. Зачем это было?

Прежде всего, если шорты составляют 16 бит в этой реализации, 57000 не подойдет, поэтому вы не сможете сохранить 57000 в своем коротком sNum. Он переполнится, уступив -8536.

В литье 2 вы сначала конвертируете (используя явное приведение) из короткого (-8536) в unsigned short (57000, так как это тот же бит-шаблон, что и -8536, но интерпретируется как беззнаковое число), а затем от unsigned short до unsigned int (57000).

В литье 1 вы конвертируете непосредственно из короткого (-8536) в unsigned int.

3

Существует только один бросок в вашем коде:

uiNum = (unsigned short)sNum; 

Остальная часть вещей вы призывающих слепки называются (неявные) преобразования в языке Си. В конверсиях нет скрытых промежуточных шагов. Если вы хотите пройти промежуточный тип, вы можете заставить его с помощью приведения или присвоения в переменную этого типа.

Во-вторых, линия:

short sNum = 57000; 

имеет определенное реализацией поведение. Вам следует избегать кода, который преобразует (неявно или через листинг) значения в подписанные типы, в которые значение не подходит.

Наконец, вы не должны задавать такой вопрос о «C/C++». Нет такого языка, и системы типов (даже для простых целочисленных типов) достаточно различны на двух языках, что многие вопросы будут иметь разные ответы в зависимости от того, какой язык вы фактически используете.

0

короткой имеет 8 * 2 = 16 бит

INT имеет 8 * 4 = 32 бит

Если не указано явно, как беззнаковое как INT и короткие подписаны. В случае подписанного числа самый левый бит имеет бит знака.

поэтому в подписанном короче мы остаемся с 16 - 1 = 15 бит. Следовательно, верхний предел короткого должен быть 2^15 32768. для любого большего числа, чем это, вычитается из верхнего предела 2 × 16 (= 65536 для без знака или общей емкости) и сохраняется с отрицательным знаком [это поразрядное комплиментом]

Здесь 65536 - 57000 = -8536 Следовательно, результат

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