Java中最常用的方法是验证转换long
为int
不会丢失任何信息?
这是我目前的实施:
public static int safeLongToInt(long l) {
int i = (int)l;
if ((long)i != l) {
throw new IllegalArgumentException(l + " cannot be cast to int without changing its value.");
}
return i;
}
Run Code Online (Sandbox Code Playgroud) 我很想知道如果我给无符号变量赋一个负值会发生什么.
代码看起来有点像这样.
unsigned int nVal = 0;
nVal = -5;
Run Code Online (Sandbox Code Playgroud)
它没有给我任何编译器错误.当我运行程序时,nVal
分配了一个奇怪的值!是否可以将某个2的补码值分配给nVal
?
这个问题不是关于如何将long正确地转换为int,而是当我们错误地将它转换为int时会发生什么.
所以考虑这个代码 -
@Test
public void longTest()
{
long longNumber = Long.MAX_VALUE;
int intNumber = (int)longNumber; // potentially unsafe cast.
System.out.println("longNumber = "+longNumber);
System.out.println("intNumber = "+intNumber);
}
Run Code Online (Sandbox Code Playgroud)
这给出了输出 -
longNumber = 9223372036854775807
intNumber = -1
Run Code Online (Sandbox Code Playgroud)
现在假设我做了以下更改 -
long longNumber = Long.MAX_VALUE - 50;
Run Code Online (Sandbox Code Playgroud)
然后我得到输出 -
longNumber = 9223372036854775757
intNumber = -51
Run Code Online (Sandbox Code Playgroud)
问题是,long的值如何转换为int?
我四处搜寻,试图找到这个问题的答案,但找不到明确的答案。
我看到这个答案,他在旁注中写道:
对于无符号类型,规则有所不同;将有符号或无符号整数转换为无符号类型的结果是明确定义的。
那么什么是明确定义的行为呢?
当从 转换unsigned long long
为 时unsigned int
,是否有定义的行为?是不是只截掉32个MSB?(留给我 32 LSB)。
让我们假设它sizeof(unsigned int)
在我的系统4
中。
在不进行强制类型转换的情况下进行分配和使用强制类型转换进行分配时是否有不同的行为?sizeof(unsigned long long)
8
如果我将一个double转换为int会发生什么,但double的值超出范围?
让我说我做这样的事情?
double d = double(INT_MIN) - 10000.0;
int a = (int)d;
Run Code Online (Sandbox Code Playgroud)
什么是a的价值?这是不确定的?
我有一些不明白如何逐步将int转换为浮动?假设我有一个二进制格式的带符号整数.而且,我想把它用手漂浮.但是,我不能.因此,CAn一个人告诉我如何逐步进行转换?
我在c中进行多次转换?喜欢;
int a = foo ( );
float f = ( float ) a ;
Run Code Online (Sandbox Code Playgroud)
但是,我还没弄清楚背景会发生什么.而且,为了更好地理解,我想手工完成转换.
编辑:如果你对转换了解很多,你也可以提供有关浮动到双转换的信息.而且,对于float到int
#include <stdio.h>\n#include <cs50.h>
\nint main(void)\n{\nlong cc = get_long("信用卡:"); // 获取输入
\nlong len = 0; //intialized length\nlong x = cc; // set 2nd variable = to cc to prevent manipulation of cc\n\nwhile (x != 0) // length count loop while x is divisable loop will continue will be stored as len\n{\n x = x / 10;\n len++;\n}\n\n\nif ((len != 16) && (len != 15) && (len != 13)) //Checking for length to see if number matchs possible postive outcomes\n{\n …
Run Code Online (Sandbox Code Playgroud)