Побитовое сравнение char и unsigned char в Stack Overflow

Почему в C ++ нет такого побитового компаратора, как «====»? Должен ли я приводить переменные каждый раз?

(примечание: я уже знаю логико-арифметические операторы, выглядят иначе. Кстати, здесь также нет арифметики-xor a ^^ b 🙂
Я знаю, что могу проверить&b против a (или b), a ^ b против нуля, …
)

#include "stdafx.h"#include<iostream>
#include<stdlib.h>

int main()
{
char a=-1;
unsigned char b=0;

for(b=0;b<255;b++)
{
if(a==b)std::cout<<(int)b;  //cannot find 11111111)2==11111111)2
//ok, it looks -1==255 surely
//if(a====b)std::cout<<" bitwise equal "; could be good
}bool compare=true;
bool bit1=false,bit2=false;
unsigned char one=1;

b=255; //bit-swise equal to a
for(int i=1;i<7;i++)
{
bit1=(a>>i)&one;
bit2=(b>>i)&one;
if(bit1!=bit2){compare=false;return;}//checks if any bit is different
}

if(compare)std::cout<<(int)b; //this writes 255 on screen

getchar();
return 0;
}

Благодарю.

Я мог бы сделать:

__asm
{
push push....
mov al,[a]
mov dl,[b]
cmp al,dl    //this is single instr but needs others
je yes
mov [compare],false
jmp finish
yes:
mov [compare],true
jmp finish

finish:
pop pop...

Раздутый код …

0

Решение

Вы могли бы сделать что-то вроде:

a ^ b == 0
2

Другие решения

Такой оператор не будет работать, потому что он будет зависеть от платформы.

Я предполагаю, что ‘x === y’ должен возвращать false, когда x и y имеют разную длину, а так как int имеет разную длину на разных платформах, так будет и результат этой операции.

2

Вы действительно должны сравнить подписанный с неподписанным?

Вы должны изменить свой алгоритм, чтобы оба операнда == иметь такую ​​же подпись.

2

Вы не можете делать какие-либо сравнения на char или же unsigned char, интеграл
продвижение означает, что наименьший интегральный тип, который вы можете сравнить
int; оба char и unsigned char будет повышен до int
перед сравнением. (После чего на большинстве современных машин
не будет разницы между побитовым сравнением и сравнением значений.)

Я испытываю желание сказать, что вы не должны хотеть побитового сравнения. Во многих
пути, неявные преобразования (включая рекламные акции) вызывают больше
проблемы, чем что-либо еще, и логично, вы должен должен быть
явно, и укажите, что вы хотите сравнить. (И тесты для
равенство гарантированно будет «большим», если тип unsigned char,
Вот почему memcmp определяется с точки зрения unsigned char
сравнения.)

2