omparações de ponteiros em C. Eles estão assinados ou não assinado

Oi, tenho certeza de que essa deve ser uma pergunta comum, mas não consigo encontrar a resposta quando a procuro. Minha pergunta diz respeito basicamente a dois indicadores. Quero comparar seus endereços e determinar se um é maior que o outro. Eu esperaria que todos os endereços não fossem assinados durante a comparação. Isso é verdade e varia entre C89, C99 e C ++? Quando compilo com o gcc, a comparação não é assinad

Se eu tenho dois ponteiros que estou comparando assim:

char *a = (char *) 0x80000000; //-2147483648 or 2147483648 ?  
char *b = (char *) 0x1; 

Entãoa é maior. Isso é garantido por um padrão?


Edita para atualizar o que estou tentando fazer. Tenho uma situação em que gostaria de determinar que, se houver um erro aritmético, ele não fará com que um ponteiro fique fora dos limites. Agora eu tenho o endereço inicial da matriz e o endereço final. E se houver um erro e o cálculo do ponteiro estiver errado, e fora dos endereços válidos de memória para a matriz, eu gostaria de garantir que não ocorra violação de acesso. Acredito que posso evitar isso comparando o ponteiro suspeito, que foi retornado por outra função, e determinando se ele está dentro do intervalo aceitável da matriz. A questão dos endereços negativos e positivos tem a ver com a possibilidade de fazer as comparações, conforme discutido acima na minha pergunta origina

Agradeço as respostas até agora. Com base na minha edição, você diria que o que estou fazendo é um comportamento indefinido no gcc e no msvc? Este é um programa que será executado apenas no Microsoft Windows.

Aqui está um exemplo simplificado:

char letters[26];  
char *do_not_read = &letters[26];  
char *suspect = somefunction_i_dont_control(letters,26);  
if( (suspect >= letters) && (suspect < do_not_read) )  
    printf("%c", suspect);  



Outra edição, depois de ler a resposta de AndreyT, parece estar correto. Portanto, farei algo assim:

char letters[26];  
uintptr_t begin = letters;  
uintptr_t toofar = begin + sizeof(letters);  
char *suspect = somefunction_i_dont_control(letters,26);  
if( ((uintptr_t)suspect >= begin) && ((uintptr_t)suspect < toofar ) )
    printf("%c", suspect);  


brigado a todo

questionAnswers(5)

yourAnswerToTheQuestion