一个int型量的机器表示问题

ltolll 2006-07-27 10:32:20
在16位机上
int x=0xFFFF;
问x的值为?

我觉得是:x=1111,1111,1111,1111=-32767
书上答案是:-1
不知是怎么做的?
...全文
427 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltolll 2006-08-10
  • 打赏
  • 举报
回复
感谢houdy的回答,我是不是可以这样理解,当机器数要转化成实际数值时,先检查其目标类型(每个类型有自已的一套转化规则),然后以其规则转化。以整型为例:
x=0xFFFF
二进制:1111,1111,1111,1111
判断符号位,为1(负),则编译器(这个工作是编译器做的吗?)认定此数为一负数且为补码表示
(补码-1)=》反码:1111,1111,1111,1111 - 1 =》1111,1111,1111,1110
(反码)取反=》原码 (1111,1111,1111,1110)反 =》1000,0000,0000,0001(符号位不参加运算)
最后得到-1
ckp 2006-08-07
  • 打赏
  • 举报
回复
#include "stdio.h"
#include <sys/types.h>

int main(int argc, char* argv[])
{
unsigned char i = 0;
unsigned short i16 = 0;
unsigned int i32 = 0;
unsigned _int64 i64 = 0;

i--;
i16--;
i32--;
i64--;

//无符号8位整数
//unsigned char
//无符号16位整数
//unsigned short
//无符号32位整数
//unsigned long
//无符号64位整数
//unsigned _int64
printf("byte i = %u\n", i);
printf("unsigned short i16 = %hu\n", i16);
printf("unsigned int i32 = %lu\n", i32);
printf("int64 = %I64u\n", i64);
return 0;
}
xddzccn 2006-08-07
  • 打赏
  • 举报
回复
要深入的理解硬件和代码的关系推荐看
深入理解计算机系统!
bacmoz 2006-08-07
  • 打赏
  • 举报
回复
有符号数跟无符号数的区别
linxb1210 2006-08-06
  • 打赏
  • 举报
回复
底层的问题
不明白
houdy 2006-08-06
  • 打赏
  • 举报
回复
x=0xFFFF实际上x的值为65535?
0xFFFF就等于65535?,我觉得这个观点是不对的。
单个0xFFFF是没有什么意义的,我们只能从0xFFFF看出这个16进制数占用2个字节,其中每位都是1,仅此而已。只有赋予一个数据类型后,才能根据数据类型将0xFFFF"解析"成相应的数据:
1.将0xFFFF赋给一个short型(2 bytes)的变量,0xFFFF就给解析成(-1)
2.将0xFFFF赋给一个unsigned short型的变量,0xFFFF就被解析成(65535)
3.将0xFFFF赋给一个int型(4 bytes)的变量,0xFFFF被转化成0xFFFFFFFF,即(-1)
4.将0xFFFF赋给一个unsigned short型的变量,0xFFFF被转化成0x0000FFFF,即(65535)
ciwei6744 2006-08-06
  • 打赏
  • 举报
回复
越界的数计算机可以循环过来再算,所以编译器不会认为他是错误的
ltolll 2006-08-06
  • 打赏
  • 举报
回复
x=0xFFFF实际上x的值为65535,为什么计算机在存储之前不判断一下,这个数是超出了界限的呢?这个数在赋值时可以知道0xFFFF是个正数,而在存储时会发现1111,1111,1111,1111的第一位为1显然是负数,与之前的条件矛盾,这时就可以得出正数数值过大的结论,这样也就不会造成存储错误了。
我就是不理解,这是很容易判断的,为什么机器不去判断呢,原因何在?
xddzccn 2006-08-06
  • 打赏
  • 举报
回复
studing!
a_b_c_abc9 2006-08-06
  • 打赏
  • 举报
回复
houdy的进一步解释很好、
aaalife 2006-07-27
  • 打赏
  • 举报
回复
嗯...补码...
tailzhou 2006-07-27
  • 打赏
  • 举报
回复
补码的规则:
1)取反;
2)加1;

以-1为例;
0000000000000001
取反后
1111111111111110
加一后
1111111111111111
tailzhou 2006-07-27
  • 打赏
  • 举报
回复
机器内负数用补码表示


1111,1111,1111,1111 是 -1的补码;


fishyqd 2006-07-27
  • 打赏
  • 举报
回复
其它相关内容可以看计算机组成原理
anyue417 2006-07-27
  • 打赏
  • 举报
回复
呵呵,以上皆为正解
jixingzhong 2006-07-27
  • 打赏
  • 举报
回复
全1 是负数的最大值 ...

在机器内部使用的是 补码 !

楼主可以这么记,
先不管符号位,
在其他位中, 全1 显然是最大的,
然后前面符号位是 1,
那么是负数, 最大的负数? 当然是 -1 ....

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧