社区
C语言
帖子详情
一个int型量的机器表示问题
ltolll
2006-07-27 10:32:20
在16位机上
int x=0xFFFF;
问x的值为?
我觉得是:x=1111,1111,1111,1111=-32767
书上答案是:-1
不知是怎么做的?
...全文
463
16
打赏
收藏
一个int型量的机器表示问题
在16位机上 int x=0xFFFF; 问x的值为? 我觉得是:x=1111,1111,1111,1111=-32767 书上答案是:-1 不知是怎么做的?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 的最低位字节截取出来。因此,将数据由值域较宽类型强制转换到值域较窄类型时
C++中的数据类型及其
表示
、计算方法
任务1:计算机编程中的数据类型 一. 整型(
int
/unsigned
int
) 1.
机器
数 原码:由符号位(正数为0,负数为1)加上真值绝对值的二进制
表示
。
表示
范围为−2n−1+1∼0-2^{n-1}+1\sim 0−2n−1+1∼0,+0∼+2n−1+0\...
int
和unsigned
int
例题解答
unsigned
int
类型比
int
类型的容量大是因为,unsigned
int
是无符号类型的,所以最高位不
表示
正负,而
int
类型的最高位是
表示
正负的,1
表示
负数,0
表示
正数。 ②计算机中负数的存储方式——其补码。在计算机中,负数...
4.1
int
类型介绍
C语言提供了许多整数类型,为什么一种类型不够用?因为 C语言让程序员针对不同情况选择不同的类型。特别是,C语言中的整数类型可
表示
不同的取值范围和正负值。一般情况使用
int
类型即可,但是为满足特定任务和...
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章