所以我有一个无符号整数Q,其值为0xfccd11c0。
当我用core
打印时,我得到-53669440,这是0xfccd11c0的有符号整数表示,所以我明白了。
但是当我用extern crate core;
打印时,我得到939524096.我知道为了打印双值,你需要使用printf("%i", Q);
作为字符串格式,但是,转换时会发生什么加倍导致该值打印?
答案 0 :(得分:4)
在public static function l($string)
{
$string = trim(preg_replace('/\s+/', ' ', $string));
if($_SESSION['lang']=='default')
{
return $string;
}
else
{
$file = 'translations/'.$_SESSION['lang'].'.php';
if (file_exists($file))
{
require($file);
$search = array_key_exists($string, $translation);
if($search && $translation[$string] != ' ')
{
# ZNALAZŁ TŁUMACZENIE
return $translation[$string];
}
else
{
if(!$search)
{
# NIE ZNALAZŁ TŁUMACZENIA
$translation[$string] = ' ';
$serialized = "<?php\n\$translation = array( \n\n\n";
while ($array = current($translation)) {
if(key($translation))
{
$serialized .= "'".key($translation)."'\n=>\n'".current($translation)."',\n\n\n";
}
next($translation);
}
$serialized .= ");\n?>";
file_put_contents($file, $serialized);
}
if($translation[$string] == ' ')
{
# ZNALAZŁ PUSTE TŁUMACZENIE
}
return $string;
}
}
else
{
return $string;
}
}
}
等函数中使用错误的格式说明符会触发未定义的行为;在这种情况下,任何事情都可能发生。
答案 1 :(得分:4)
问题是4241297856
(double)Q具有64位IEEE-754表示0x41EF99A238000000
在little-endian中,它的低4字节占用与(int)Q相同的空间。
0x38000000是939524096
便捷的在线转换器:http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html
答案 2 :(得分:1)
在这里,Q被显式转换(由你)到一个新的内存对象,我们称之为Q_dbl
。它被传递给printf
函数,但是当你指定%i
参数时,这块内存被解释为整数。这是在低级别发生的事情的想法。
unsigned int Q = 0xfccd11c0;
printf("%i", Q);
printf("%i", (double)Q);
auto Q_dbl = (double)Q;
printf("%f", Q_dbl);
printf("%i", Q_dbl);
代码未经过测试。
答案 3 :(得分:0)
您可以轻松模拟此代码的内容:
unsigned int Q = 0xfccd11c0;
double dQ = (double)Q;
int *x = (int*)(&dQ);
* x现在等于939524096。
答案 4 :(得分:0)
请查看我的回答类似的问题:How does the function printf works in C?。基本上,C编译器在两个不同的注册表集上执行整数和浮点运算,printf
从与格式字符串对应的注册表中提取它的参数。当格式字符串和传递的参数不匹配时,这是导致printf
奇怪行为的原因之一。
请注意,当编译器优化将参数放在可用的注册表中而不是将它们放在堆栈上时,会发生数量减少的参数。