unsigned не unsigned?

Модератор: Модераторы разделов

edranovdenis
Сообщения: 135
ОС: main mdv2006

unsigned не unsigned?

Сообщение edranovdenis »

Код: Выделить всё

#include <stdio.h>

int main(){
    unsigned int n=0;
    n--;
    printf("%d\n",n);
return;
}


ну и почему же в выдаче -1?
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: unsigned не unsigned?

Сообщение frp »

Просто %d означает signed int (и printf печатает его как signed), нужно юзать %ud.
Спасибо сказали:
edranovdenis
Сообщения: 135
ОС: main mdv2006

Re: unsigned не unsigned?

Сообщение edranovdenis »

нужно юзать просто %u
склероз...
спасибо огромное! :)

кстити вот что попутало:

Код: Выделить всё

unsigned char a=0;
char b=0;
a--; b--;
printf("%d\t%d",a,b);

на char это действует :)
Живая мысль подобна реке бегущей с гор - будучи полноводной, не засохнет, но непременно впадет в океан.
Спасибо сказали:
math
Сообщения: 290
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: unsigned не unsigned?

Сообщение math »

edranovdenis писал(а):
05.06.2010 21:24

Код: Выделить всё

unsigned char a=0;
char b=0;
a--; b--;
printf("%d\t%d",a,b);

на char это действует :)

по-моему так ведь вообще нельзя делать, не так ли? %d означает что идёт 4-байтовый (не нек. платформе) аргумент, а ему подсовывается 1-байтовый.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: unsigned не unsigned?

Сообщение frp »

edranovdenis писал(а):
05.06.2010 21:24
на char это действует

А должно вываливаться с сегфолтом :) И на Big Endian архитектурах действовать не должно (должно выводить большое значение).
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: unsigned не unsigned?

Сообщение NickLion »

frp писал(а):
06.06.2010 18:25
А должно вываливаться с сегфолтом :)

На x86, x86_64 - не должно. В стек помещается машинное слово. Т.е. 4 и 8 байт соответственно. Но это архитектурозависимо, да.
Спасибо сказали:
math
Сообщения: 290
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: unsigned не unsigned?

Сообщение math »

NickLion писал(а):
06.06.2010 19:10
frp писал(а):
06.06.2010 18:25
А должно вываливаться с сегфолтом :)

На x86, x86_64 - не должно. В стек помещается машинное слово. Т.е. 4 и 8 байт соответственно. Но это архитектурозависимо, да.

Нет, вспомнил. Стандартом гарантируется, что при переменном списке аргументов все целые приводятся к (unsigned) long. Так что с char это работает законно, архитектуронезависимо.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: unsigned не unsigned?

Сообщение frp »

NickLion писал(а):
06.06.2010 19:10
frp писал(а):
06.06.2010 18:25
А должно вываливаться с сегфолтом :)

На x86, x86_64 - не должно. В стек помещается машинное слово. Т.е. 4 и 8 байт соответственно. Но это архитектурозависимо, да.

Т.е. делая push ax я помещаю в стек 4 байта? Что-то не верится. Или компилятор просто генерирует код, в котором в стек всегда помещается машинное слово?
Спасибо сказали:
math
Сообщения: 290
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: unsigned не unsigned?

Сообщение math »

frp писал(а):
07.06.2010 08:40
NickLion писал(а):
06.06.2010 19:10
frp писал(а):
06.06.2010 18:25
А должно вываливаться с сегфолтом :)

На x86, x86_64 - не должно. В стек помещается машинное слово. Т.е. 4 и 8 байт соответственно. Но это архитектурозависимо, да.

Т.е. делая push ax я помещаю в стек 4 байта? Что-то не верится. Или компилятор просто генерирует код, в котором в стек всегда помещается машинное слово?

просто если список аргументов переменный (int printf(char const *, ...)), то все целые аргументы передаются как long, т.е. как 4 (8) байт.
в случае явного описания (int f(char c)) в стек будет загоняться 1 байт.
Спасибо сказали: