社区
C语言
帖子详情
一个int型量的机器表示问题
ltolll
2006-07-27 10:32:20
在16位机上
int x=0xFFFF;
问x的值为?
我觉得是:x=1111,1111,1111,1111=-32767
书上答案是:-1
不知是怎么做的?
...全文
484
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 ....
int
型和char型之间的类型转换
目前绝大多数编译器,
int
型数据占 4 字节, char 型占 1 字节。进行不同数据的强制转换其实就是数据占用字节扩充或者截断。 比如
int
a; char b; a=(
int
)b; b=(char)a; 由 b 转换成
int
型数据就是将 b 扩充 3 个字节;而将 a 转换成 char 型数据就是将 a 的最低位字节截取出来。因此,将数据由值域较宽类型强制转换到值域较窄类型时
C/C++中
一个
int
型指针占几个字节?
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是
一个
代表内存地址的长的十六进制数。如下图所示,定义了
一个
int
型的c变量,然后定义
一个
int
型的指针a指向c变量(指向可能不太好理解,实际上就是a把c的地址存起来了),那么这个这个指针是把
int
c的第
一个
内存单元的地址存起来了呢,还是把
int
c的4个内存单元的地址都存起来了呢。答案是,不管这个指针是什么类型的,不管指针所指向的变量是什么类型的,都只存第
一个
内存单元的地址,所以指针的大小是固定的。
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\sim +2^{n-1}+0∼+2n−1。 例如,以8 bit字长为例(下同),[−74]原=1100 1010[-74]_...
int
和unsigned
int
例题解答
(1)必须知道的是: ①
int
类型和unsigned
int
类型的差别。unsigned
int
类型比
int
类型的容量大是因为,unsigned
int
是无符号类型的,所以最高位不
表示
正负,而
int
类型的最高位是
表示
正负的,1
表示
负数,0
表示
正数。 ②计算机中负数的存储方式——其补码。在计算机中,负数存储的方式都是以其其补码形式储存,例如:6在计算机的存储形式是0000 0000 0000 0110(32位计算机中),而-6是1000 0000 0000 0110 (32位机下)(最高位是符号位),补码也就
4.1 【保姆级 C 语言入门】整数类型全解析!
int
/short/long/unsigned 用法 + 避坑指南
本文详细讲解了C语言中整数类型家族的使用方法。主要内容包括:1)不同整数类型(short、
int
、long、longlong及无符号类型)的存储范围和使用场景;2)变量声明、初始化和赋值的正确方法;3)整数溢出的原理及解决方法;4)不同编程场景下的类型选择建议;5)常见错误排查指南。文章强调应根据数值范围、正负属性和运行平台选择合适的整数类型,避免溢出等错误。通过实例演示和详细说明,帮助读者掌握整数类型的核心用法,为编写稳定可靠的代码打下基础。
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章