dlinyj: (Default)
[personal profile] dlinyj
Простейшая, простейшая задачка на сях - сделать бегущий бит в байте. Циклически бегущий бит. Этакий огонёк. Пишу такой примитивнейший код:
char rol(char a)
{
	return (a << 1) | (a >> 7);
}


И потом в цикле его вызываю:

	char port = 0x01;
	while (1) {
...
		printf("%2X\n", (int)port);
	}


И получаю странный результат:
 2
 4
 8
10
20
40
FFFFFF80
FFFFFFFF
FFFFFFFF
...


Куда подевался битик? Я НЕ понимаю!

Date: 2017-03-25 01:58 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Замени на uint8_t — когда у тебя в старшем бите 1, получается отрицательное число, ты его преобразуешь в int64_t со всеми вытекающими.

Date: 2017-03-25 02:02 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Помогло, но не спортивно.

Date: 2017-03-25 02:03 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Почему это не спортивно. Работает, и работает правильно. А signed ты никогда правильно не выведешь!
#include <stdio.h>
unsigned char rol(unsigned char *a){
	unsigned char c = *a;
	*a = (c << 1) | (c >> 7);
	return *a;
}
int main(){
	int i;
	unsigned char bit = 0x80;
	for(i = 0; i < 8; ++i)
		printf("%02X\n", rol(&bit));
	return 0;
}

Выхлоп:
01
02
04
08
10
20
40
80
Edited Date: 2017-03-25 02:04 pm (UTC)

Date: 2017-03-25 02:05 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Точно, надо было ансигнед чар делать! Не люблю эти дополнительные типы!.

Date: 2017-03-25 02:06 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
А я как раз-таки после нескольких косяков с разными архитектурами понял, что нужно перестать использовать все эти int'ы и long'и. А char'ы использовать лишь при работе со строками.

Date: 2017-03-25 02:20 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Это да... Это я согласен.

Date: 2017-03-25 08:28 pm (UTC)
From: [identity profile] guman0id.livejournal.com
Самое интересное, что по стандарту char может быть как signed, так и unsigned.

Date: 2017-03-25 08:30 pm (UTC)
From: [identity profile] guman0id.livejournal.com
У gcc даже можно переключать дефолт опциями -fsigned-char/-funsigned-char

https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html

Date: 2017-03-31 02:44 pm (UTC)
From: [identity profile] savant (from livejournal.com)
ЕМНИП это три разных типа

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 11:23 am
Powered by Dreamwidth Studios