关于字长

来源:互联网 发布:linux apm安装 编辑:程序博客网 时间:2024/04/28 17:41

来自CSDN讨论帖

http://topic.csdn.net/u/20110517/15/b1b5e943-bf28-488e-a743-b7f9cd74ffc6.html

 

题目:

评价下面的代码片断:

    对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:

    unsigned int compzero = ~0;

这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。


CSDN网友  ljt3969636
unsigned int compzero = 0xFFFF;
意图是想让compzero 全是二进制1,但是 0xFFFF是代表程序员认为int 是2个字节的,在两个字节的机器上这样可以要是4字节呢?系统就自动变成相当于unsigned int compzero = 0x0000FFFF;的形式这下和你的意图不一样了吧?

那我想在2或4字节都全1怎么办?

    unsigned int compzero = ~0;
~0是在说我不管你是两字节还是四字节我只要全1,系统你自己去自适应去,所以写成~0,这样在两字节机器上系统会自动变成0xFFFF,四字节机器上变成0xFFFFFFFF保证了你的意图。

 

CSDN网友 vimney

嵌入式如果用int关键字才是真正不懂嵌入式,
如果想做到软件可以移植,应该将类型给定义清晰,

    typedef unsigned char INT8U; 
    typedef signed char INT8S;
编码时使用INT8U去定义数据类型。

明知道int在不同的机器上可能有不同的字长,还使用int,自找苦吃。

 

 

CSDN网友 wtx_sonery

似乎这样也行。。。
    unsigned int compzero = -1;

 

CSDN网友 dx_107

由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。同时在相同位数的情况下,所能表达的整数范围变大。
如果表达式中既有int 又有unsigned int,则所有的int数据都被转化为unsigned int类型。-1必须转换为unsigned int型,32位即0xffffffff,很显然溢出了。

 

CSDN网友 gykuku

最高位为1 其余15位取绝对值原码 000000000000001 然后这15位取反,111111111111110 加上符号位,整体+1,全是1。

 

 

CSDN网友 sd01101230

抛开字长,
-1就是 无符号整形的最大值。
~0就是取反。变成(1)*
不知道楼主的题目为什么会在 32位下这样使用:x = 0xFFFF
至少明了点也得这么写吧:x = 0xFFFFFFFF
你看Windows.h的文件就知道了。
有(-1),有(~0),有0xFFFFFFFF的写法。