Войти
ПрограммированиеФорумОбщее

В C/C++ про дефолту типы знаковые или беззнаковые?

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 Следующая »
#0
15:58, 26 июля 2021

Столкнулся сегодня с тем, что в Watcom C по умолчанию типы беззнаковые.


Вот такой пример:

char p=-8;
if(p==-8)Printf("Yea");
else Printf("No!");

выдаст в Watcom C "No!". 
В то время как в mingw выдаёт: "Yea"

Согласно стандарту K&R  по дефолту какие типы знаковые или нет? 
Кто нарушил стандарт - Watcom или mingw?


#1
16:11, 26 июля 2021

Gradius
implementation defined.

#2
16:21, 26 июля 2021

По стандарту - это конкретно char особый. Остальные целочисленные типы "по умолчанию" знаковые, т. е. int это синоним signed int.
А вот char, signed char, unsigned char - с т. з. компилятора это 3 разных типа, что наблюдаемо например при перегрузках функций/шаблонах.
Тип char может быть как знаковым, так и беззнаковым, на успотрение компилятора (implementation defined).
Для GCC есть ключ -funsigned-char, для того, чтобы выбирать.

#3
17:23, 26 июля 2021

Надо быть осторожными с конструкциями "=-", это устаревший синтаксис, но многие компиляторы его поддерживают, включая watcom. Это тоже самое, что "-=". GNU по умолчанию не будет воспринимать такое как единую лексему, может как-нибудь можно включить поддержку и у него. Скобки вокруг отрицательных констант - не лишние.

#4
17:49, 26 июля 2021

Zab
> Надо быть осторожными с конструкциями "=-", это устаревший синтаксис

Изображение
#5
18:35, 26 июля 2021

Gradius
https://users.pja.edu.pl/~jms/qnx/help/watcom/compiler-tools/ccall32.html :

char

An item of type char occupies 1 byte of storage. Its value is in the following range:

    0 <= n <= 255

Note that char is, by default, unsigned. The Watcom C/C++ compiler option j can be used to change the default from unsigned to signed. If char is signed, an item of type char is in the following range:

    -128 <= n <= 127

You can force an item of type char to be unsigned or signed regardless of the default by defining it to be of type unsigned char or signed char, respectively.

#6
18:47, 26 июля 2021

return [](){};
Не в курсе, что писать "x=-1" нельзя, потому как оно должно быть воспринято как "x=x-1"? Современные компиляторы как правило генерируют ворнинг на такое, но оно остается частью синтаксиса С/С++. Скобки или пробел обязательны между "=" и "-", лучше скобки, с пробелом легко промахнуться и не заметить.

#7
(Правка: 19:34) 19:25, 26 июля 2021

Zab
> Современные компиляторы как правило генерируют ворнинг
Продемонстрируешь?
https://godbolt.org/

#8
19:28, 26 июля 2021

https://stackoverflow.com/questions/41616477/what-is-the-differen… ent-operators

#9
(Правка: 19:50) 19:40, 26 июля 2021

Gradius
> Вот такой пример:
Такой пример не совсем однозначный, переменная "char p" вообще не создается, и оптимизатор оставляет либо Printf("Yea"); либо Printf("NO").

Но если писать так

if (p==(char)248) ...
или
if (p==(char)-8)

А "char p" будет глобальной или входным параметром функции. То условие действительно будет работать как

        cmp    al, -8 (248)
        jne    .LBB0_2

Независимо от типа данных, но всегда будет Printf("Yea") при значении p=(char)-8.

Тебе уже правильно описали что это особенный тип, но как ты его хочешь использовать это твое дело.

То есть правильней будет написать так

char p=(char)-8;
if(p==(char)-8)Printf("Yea");
else Printf("No!");
Что даст в результате Printf("Yea") для всех компиляторов.

#10
21:14, 26 июля 2021

Gradius
> Столкнулся сегодня с тем, что в Watcom C

где же ты его сейчас выкопал?

#11
22:45, 26 июля 2021

Gradius
В вакоме видимо char = unsigned char, а в гцц char = signed char.  В сравнении вакома оба конверятся в signed short.

#12
0:01, 27 июля 2021

Если выкопать ваком подревнее, там еще и int будет 16-битный. Но зачем?

#13
7:31, 27 июля 2021

FordPerfect
> https://users.pja.edu.pl/~jms/qnx/help/watcom/compiler-tools/ccall32.html :

Мощно!

foxes
> То есть правильней будет написать так
>
> char p=(char)-8;
> if(p==(char)-8)Printf("Yea");
> else Printf("No!");

Проверял - работает, независимо от конфигурации.

innuendo
> где же ты его сейчас выкопал?

В анальных закромах интернета много чего интересного лежит.

lookid
> В вакоме видимо char = unsigned char, а в гцц char = signed char. В сравнении
> вакома оба конверятся в signed short.

Переключается ключём -j:

Изображение

jaguard
> Если выкопать ваком подревнее, там еще и int будет 16-битный. Но зачем?

Затем: https://gamedev.ru/flame/forum/?id=262348&page=5

Реверсю старую ДОС-игру.  Она как раз написана на Watcom C. 
С конвенциями вызовов процедур полное согласие и тотальный доступ к железу имеется!

#14
(Правка: 11:02) 10:35, 27 июля 2021

Gradius
> Реверсю старую ДОС-игру.  Она как раз написана на Watcom C. 
Ты пытаешься превратить код ассемблера в код для С современных компиляторов, но при этом пихаешь его в Watcom - это странно. Тебе так не кажется?
Не важно из чего изначально был получен ассемблер, IDA выдает совсем иное. Просто определись с тем что код от Hex Rays не для Watcom C. Хотя наверняка можно под него настроить.

И еще, твоя тема во флейме, а там в основном троли себе цену набивают.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее