Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中将无符号长字符转换为64位有符号长字符_C_Winapi_Java Native Interface_Type Conversion - Fatal编程技术网

在C中将无符号长字符转换为64位有符号长字符

在C中将无符号长字符转换为64位有符号长字符,c,winapi,java-native-interface,type-conversion,C,Winapi,Java Native Interface,Type Conversion,我试图从类型DWORDLONG(在WIN32中定义为无符号64位int)返回类型jlong(在JNI中定义为有符号的64位长值) 简单类型铸造: DWORDLONG dwl = 1000000000000; jlong n = (jlong) dwl; 更改值,因为操作未定义 那么,如何将无符号long转换为有符号long,并保持与以前相同的数值 更新 问题的出现似乎是因为我的测试中出现了指针解引用错误。演员阵容没有改变价值。感谢所有评论/回答的人,至少现在我知道这是一个完全合法的操作。你是如

我试图从类型DWORDLONG(在WIN32中定义为无符号64位int)返回类型jlong(在JNI中定义为有符号的64位长值)

简单类型铸造:

DWORDLONG dwl = 1000000000000;
jlong n = (jlong) dwl;
更改值,因为操作未定义

那么,如何将无符号long转换为有符号long,并保持与以前相同的数值

更新


问题的出现似乎是因为我的测试中出现了指针解引用错误。演员阵容没有改变价值。感谢所有评论/回答的人,至少现在我知道这是一个完全合法的操作。

你是如何得出演员阵容改变价值的结论的

仅当强制转换值溢出有符号目标类型(64位整数)时,强制转换才构成未定义的行为,10000000000或“可用内存量”都不应出现这种情况(并且在运行时使用
if(dwl>JLONG\u MAX)raise\u error()
)可以防止病理病例发生)。我的猜测是你误解了测试;常量10000000000在编译时溢出了32位整数,编译为-727379968。不是演员阵容改变了这个值,这个值从一开始就被破坏了


正如评论中已经建议的,在测试程序中将10000000000更改为10000000000LL,问题将消失。

对于64位有符号整数范围内的正数(并且1E12在范围内),显示的强制转换应该可以工作(但是如果在值中添加LL或等效后缀,则更可靠)。如果没有,则可能是您的期望值不匹配(有些不是64位的值,您认为是64位的值),或者可能是编译器中存在错误。我不确定是否还有很多其他选择。您如何知道值正在变化?您是在C代码中打印它,还是在等待Java代码获得它?在转换之前是否打印了
dwl
?您为什么不能使用
jlong
jint
未定义为64位。它被定义为32位:你是说
jlong
吗?很抱歉。我是说琼。我不知道为什么我键入了jint。难道
10000000000
不应该是
10000000000ll
?问题发生在向jlong铸造数据时。当我输入问题时,整个jint铸造只是一个错误。@ghostsoldier23您如何证明在将
DWORDLONG
铸造到
jlong
时出现问题?由于
DWORDLONG
是一个无符号的64位整数,
jlong
是一个有符号的64位整数,因此从
DWORDLONG
强制转换到
jlong
对于小于2**63的所有值都可以正常工作。根据当前可用的数据,测试程序中10000000000常量的溢出似乎导致了错误的结论,即强制转换失败。(这与
jint
typo无关。)我确实发现了一个DWORDLONG值的解引用错误。这可能产生了影响。当我有能力的时候,我会再次检查JNI输出并发布结果。好吧,原来是解引用错误把一切搞砸了,而不是我的测试没有显示的cast(可能是指针赋值之前测试变量的位置?)。这样问题就解决了。现在,如果我试图将它转换为32位有符号整数(不是溢出),它还能工作吗?@ghostsoldier23是的,如果没有溢出,它还能工作。C从一开始就支持这一点,它广泛应用于系统API中,如stdio
getchar()
,在检查了
EOF
特殊值后,您需要定期将其
int
结果转换为
char