2012-04-22 5 views
4

Я беру целое число, в данном случае 192, и оставляю его 24 пробела. Кажется, ведущий 1 заставляет его стать отрицательным.«unsigned int» печатает как отрицательное число?

unsigned int i = 192; 
unsigned int newnumber = i << 24; 
NSLog(@"newnumber is %d",newnumber); 

Я ожидаю 3,221,225,472, но я получаю -1,073,741,824 (запятые добавил для ясности)

Целого числа без знака не должен быть отрицательным права?

ответ

17

Потому что вы reinterpret это в NSLog как целое число со знаком. Вы должны использовать %u, чтобы увидеть значение без знака.

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

+0

Aha. Делает совершенный смысл. Я думал, что я схожу с ума. Благодаря! – Mike

9

Вы тусклый сделать NSLog(@"newnumber is %u",newnumber);

%d преобразуют его обратно в знаковом междунар.

7

%d означает «подписанное целое число»; используйте «%u» для «целых чисел без знака».

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