2012-03-11 162 views
1

可能重复:
Signed to unsigned conversion in C - is it always safe?uint64_t如何存储负数? - 是不是它的意思是无符号

如何uint64_t中存储负数? - 是不是意味着未签名,或者是我的代码是危险的,它是通过侥幸运行的?

在代码中,我指定一个负数uint64_t中uint64_neg(我期待消极情绪,丢失的符号)分配uint64_t中的,但的int64_t的消极情绪仍然存在 - 为什么这项工作吗?

uint64_t uint64_neg = -150; 

int64_t int64_neg = uint64_neg; 

非常感谢。在标准

回答

3

第4.7条第3款说(加入我的重点):

如果目的地是带符号的价值是不变的,如果它可以在目标类型(andbit场宽度表示);否则,该值是实现定义的

也就是说,在您的编译器上,无符号签名转换只是“复制位”,在该无符号整型中留下了一些实现定义的值。这会在重新进行复制时溢出signed int的值,这恰好会在您的平台上定义的实现中返回到相同的带符号数。

该标准不保证任何这种行为。

0

位是位。发生隐式转换。只要它们的大小相同,任何unsigned int都可以表示为signed int。当我第一次看到这个时,我感到很困惑(对于许多类型的编程来说这不是很常见),并且可能因编译器和编译器不同而不同,因此在依赖它之前对其进行测试。下面是一些演示它是如何工作使用字符,使之易于理解的代码:

#include <iostream> 

int main() 
{ 
    unsigned int u = 0; 

    while (u != 256) 
    { 
     const signed char s = u; // putting an unsigned type (u) into a signed type (s) 

     // cast s up here so we don't print the extended ascii char. 
     std::cout << (signed int)s << " signed == " << u << " unsigned" << std::endl; 
     ++u; 
    } 

    return 0; 
} 

这里有一个位从码输出:

-128 signed == 128 unsigned 
-127 signed == 129 unsigned 
-126 signed == 130 unsigned 
... 
-3 signed == 253 unsigned 
-2 signed == 254 unsigned 
-1 signed == 255 unsigned 

C++ 11级的编译器会生成一个狭窄的错误如果初始化是这样的:

unsigned int j = {-32768}; // Notice the brackets 
+0

这不是非twos'补硬件真。 – 2012-03-14 19:12:07