社区
C语言
帖子详情
一个int型量的机器表示问题
ltolll
2006-07-27 10:32:20
在16位机上
int x=0xFFFF;
问x的值为?
我觉得是:x=1111,1111,1111,1111=-32767
书上答案是:-1
不知是怎么做的?
...全文
427
16
打赏
收藏
一个int型量的机器表示问题
在16位机上 int x=0xFFFF; 问x的值为? 我觉得是:x=1111,1111,1111,1111=-32767 书上答案是:-1 不知是怎么做的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 ....
C/C++中
一个
int
型指针占几个字节?
如下图所示,定义了
一个
int
型的c变量,然后定义
一个
int
型的指针a指向c变量(指向可能不太好理解,实际上就是a把c的地址存起来了),那么这个这个指针是把
int
c的第
一个
内存单元的地址存起来了呢,还是把
int
c的4个...
int
型和char型之间的类型转换
目前绝大多数编译器,
int
型数据占 4 字节, char ...由 b 转换成
int
型数据就是将 b 扩充 3 个字节;而将 a 转换成 char 型数据就是将 a 的最低位字节截取出来。因此,将数据由值域较宽类型强制转换到值域较窄类型时
int
和unsigned
int
例题解答
unsigned
int
类型比
int
类型的容量大是因为,unsigned
int
是无符号类型的,所以最高位不
表示
正负,而
int
类型的最高位是
表示
正负的,1
表示
负数,0
表示
正数。 ②计算机中负数的存储方式——其补码。在计算机中,负数...
4.1
int
类型介绍
C语言提供了许多整数类型,为什么一种类型不够用?因为 C语言让程序员针对不同情况选择不同的类型。特别是,C语言中的整数类型可
表示
不同的取值范围和正负值。一般情况使用
int
类型即可,但是为满足特定任务和...
【算法】10亿
int
型数,统计只出现一次的数
一个
int
型占4字节,10亿就是40亿字节(很明显就是4GB),也就是如果完全读入内存需要占用4GB,而题目只给1GB内存,显然不可能将所有数据读入内存。我们先不考虑时间复杂度,仅考虑解决
问题
。那么接下来的思路一般有...
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章