请进,关于C语言,一路经典面试题目
请进,关于C语言,一道经典面试题目题目如下:引用13. 评价下面的代码片断:unsigned int zero 0 unsigned
请进,关于C语言,一道经典面试题目
题目如下:
字长的事情我清楚,不清楚地是,这里的 “~0” 代表什么?求指教!
再有,第一行语句:
unsigned int zero = 0;
应该没有问题吧,谢谢!
[解决办法]您还是没太体会字长的重要
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保证了你的意图
[解决办法]无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据。
比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。
由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。同时在相同位数的情况下,所能表达的整数范围变大。
如果表达式中既有int 又有unsigned int,则所有的int数据都被转化为unsigned int类型。
这就是16位-1为什么要强制转换为(unsigned int).......
经过这番总结,前面提出的问题的答案应该就很明显了吧。-1必须转换为unsigned int型,32位即0xffffffff,很显然溢出了。