Eu quero converter long
para int
.
Se o valor de long
> int.MaxValue
, fico feliz em deixá-lo por aí.
Qual é a melhor maneira?
c#
types
int
type-conversion
long-integer
Apesar
fonte
fonte
myIntValue
pode acabar negativo quandomyLongValue
positivo (4294967294 => -2
) e vice-versa (-4294967296 => 0
). Portanto, ao implementar umaCompareTo
operação, por exemplo, você não pode converter felizmente o resultado de subtrair umlong
do outro para umint
e retornar esse valor; para alguns valores, sua comparação produziria um resultado incorreto.new Random()
usaEnvironment.TickCount
sob o capô; não é necessário semear manualmente com marcações de relógio.unchecked
, portanto, a menos que você o tenha alterado explicitamente, aunchecked
palavra - chave (conforme mostrado nesta resposta e no comentário de @ ChrisMarisic etc.) não é necessária eint myIntValue = (int)myLongValue
é exatamente equivalente. No entanto, observe que, independentemente de você usarunchecked
ou não a palavra - chave, você está obtendo o comportamento de truncamento não-matemático descrito por @TJCrowder, em que o sinal pode virar em alguns casos de estouro. A única maneira de garantir verdadeiramente a correção matemática é usar ochecked(...)
contexto, onde esses casos gerarão uma exceção.Embora eu não saiba o que fará quando for maior que int.MaxValue.
fonte
OverflowException
, exatamente o que o OP não deseja: msdn.microsoft.com/en-us/library/d4haekc4.aspxConvert
não é bom.if (value > Int32.MaxValue)
return Int32.MaxValue;
else
return Convert.ToInt32( value );
Às vezes, você não está realmente interessado no valor real, mas em seu uso como soma de verificação / código de hash . Nesse caso, o método interno
GetHashCode()
é uma boa opção:fonte
GetHashCode
será uma escolha apropriada. Se você estiver buscando uma soma de verificação persistente - um valor que será o mesmo quando você executar o aplicativo posteriormente, não useGetHashCode
, pois não é garantido que ele seja o mesmo algoritmo para sempre.A maneira mais rápida e segura é usar o Bit Masking antes do lançamento ...
O
0xFFFFFFFF
valor da máscara de bits ( ) dependerá do tamanho de Int porque o tamanho de Int depende da máquina.fonte
unchecked
contexto você não receberá um estouro - mas não precisará mascarar-seunchecked
para evitar o estouro; portanto, uma solução é necessária apenas nochecked
contexto.] Exemplo para 16 bits. Retenções assinadas de 16 bits (-32768, 32767). O mascaramento com 0xFFFF permite valores de até 65535, causando estouro, IIRC. Pode mascarar para evitar o bit de sinal, 0x7FFF ou 0x7FFFFFFF, se desejar apenas positivo.Pode converter por
Mas ele lançará uma OverflowException se o valor estiver fora do intervalo do Tipo Int32. Um teste básico nos mostrará como funciona:
Aqui há uma explicação mais longa.
fonte
Não
ser o caminho correto, matematicamente falando?
fonte
longValue
ao representável mais próximoint
se o valor original é enorme. Mas falta o mesmo tratamento para entradas muito negativas, que perderiam os bits mais significativos; você precisaria comparar comInt32.MinValue
também. O pôster original não parecia querer fixação, no entanto.A solução a seguir será truncada para int.MinValue / int.MaxValue se o valor estiver fora dos limites do número inteiro.
fonte
Uma maneira possível é usar o operador módulo para deixar apenas os valores permanecerem no intervalo int32 e depois convertê-lo para int.
fonte