数据在内存中的形式

smallputin 2008-06-09 12:52:48
VC6上
#include <stdio.h>
void main()
{
unsigned int a;
a=-2;
printf("%d\n",a);
}
a在内存的形式为0xfffffffe
#include <stdio.h>
void main()
{
int a;
a=-2;
printf("%d\n",a);
}
a在内存中和上面一样,这是怎么回事,还有int不是16嘛,怎么是32位了?
...全文
325 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
J_Factory 2008-06-13
  • 打赏
  • 举报
回复
学习。。。
zzyjsjcom 2008-06-13
  • 打赏
  • 举报
回复
int的长度跟编译器 无关, 只跟处理器的 字长有关。。。


tc在32位的机器上的int长度之所以 是16位, 是因为tc只是一个模拟器.....
lily2005lucky 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 maplewasp 的回复:]
在内存中同类型的有符号数和无符号数是一样的!
[/Quote]
fangfei_119 2008-06-13
  • 打赏
  • 举报
回复

#include<stdio.h>
void main()
{
unsigned int a=-2;
printf("a=%ud\n",a);//负数以%u输出
printf("mem:a=%xH\n\n",a&0xFFFFFFFF);//a的内存数据

int b=-2;
printf("b=%d\n",b);//负数以%d输出
printf("mem:b=%xH\n\n",b&0xFFFFFFFF);//b的内存数据

int c=2;
printf("c=%d\n",c);//正数以%u%d输出的结果一样
printf("c=%u\n",c);
printf("men:c=%xH\n",c&0xFFFFFFFF);//c的内存数据

}

//VC中用的是4个字节存储int
//内存的数据以反码规则存储
//这里的问题在用法上关键是printf函数的输出格式;
//对于负数或最高位为1的正数,既符号为为1(表示负数),%d输出负数,%u输出正数;
//对于最高二进制位即符号位为0的正数,%d %u输出相同的结果;

运行结果:
a=4294967294d
mem:a=fffffffeH

b=-2
mem:b=fffffffeH

c=2
c=2
men:c=2H
Press any key to continue
yyyapple 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 smallputin 的回复:]
那定义无符号不是就没什么用了
[/Quote]

确实无符号数给我们带来很大麻烦,看下面代码:

float sum(float a[], unsigned len)
{
int i;
float res = 0f;
for (i = 0; i <= len - 1; i++)
res += a[i];
return res;
}
假设int为2字节,当len为零时,这段代码应该返回0.0;实际上len - 1等于-1会转变成无符号数也就是65535,循环得以继续,程序会遇到存储器错误。


实际上,除了C语言很少有语言支持无符号整数,很明显其他语言设计者认为它们的麻烦比益处多;

但是当我们把字仅仅看成位的集合而没有任何数字意义时,无符号数值是非常有用的;
例如,一个字放入描述各种布尔条件的标记(flag)时,还有表示地址时,实现模运算和多精度运算时。
shuiyan 2008-06-13
  • 打赏
  • 举报
回复
数据类型长度除了char是8bit固定不变,其他与CPU的数据总线宽度直接相关。
现在的32位台式机,嵌入式ARM,都是
long 32bit
int 32bit
short 16bit

64位机
long 64bit
int 64bit
short 32bit

最长整型数的位数,跟CPU的数据总线宽度一致。
yixiao0_0 2008-06-13
  • 打赏
  • 举报
回复
有笔误

32
16
8
qmm161 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fetag 的回复:]
C/C++ code
printf("sizeof(int) == %d\n", sizeof(int));



自己看一下到底是多少,这个是最实际的!数据类型的长度是依赖于编译器的,间接上也与硬件有关...
[/Quote]

实际上一种编译器可以配置好几种硬件平台,如vs2008上面你可以配置成arm的,也可以配置成x86的!
yyyapple 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 smallputin 的回复:]
那定义无符号不是就没什么用了
[/Quote]

首先这里发生了隐形转换,由有符号数转变成无符号数,C允许有符号与无符号之间的转换,原则是基本的位保持不变;尽管C没有指定某种有符号的表示,但是几乎所有的机器都使用二进制补码;
用处很大,比如在你机器上int类型和字是2字节也就是16位,如果你要表示大于32767怎么办,你又不想用long这样大的数据类型,另外采用它们之间的转换可以起到意想不到的效果,比如我想获取无符号最大整数,可以这样

1. int x = -1;
2. unsigned ux = (unsigned) x;


第二个问题:
C标准没有具体规定int数据类型所占内存字节数,只要求long型数据长度不短于int型,short型不长与了ing型,这个取决于具体的机器类型。
liangchencf 2008-06-13
  • 打赏
  • 举报
回复
为什么和编译器无关和处理器有关?
int 编译成机器码后作为某些命令的操作数或全局变量,编译成16位就是16位,32位就是32位啊?多少位的加法cpu也是可以算得啊。
tc在32为的机器上的int长度之所以是16位也是因为它的编译器是16位的。
[Quote=引用 21 楼 zzyjsjcom 的回复:]
int的长度跟编译器 无关, 只跟处理器的 字长有关。。。


tc在32位的机器上的int长度之所以 是16位, 是因为tc只是一个模拟器.....
[/Quote]
csz_1987 2008-06-13
  • 打赏
  • 举报
回复
学习了。。。
langhuazht 2008-06-12
  • 打赏
  • 举报
回复



和硬件相关 比如32位处理器 long、 int 、short、 char 分别是4、4、2、1

ARM9处理器就是这个样子的 一般在这种嵌入式处理器中避免直接使用int

要得到32位的 就使用 long int
要得到32位的 就使用 short
要得到32位的 就使用 char

以避免因移植到不同处理器的时候出现问题。
csz_1987 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jillnicky 的回复:]
引用 4 楼 fetag 的回复:
C/C++ code
printf("sizeof(int) == %d\n", sizeof(int));


自己看一下到底是多少,这个是最实际的!数据类型的长度是依赖于编译器的,间接上也与硬件有关...

和编译器、硬件有关……
[/Quote]

为什么说和硬件也有关呢?能帮忙解释下么?
smallputin 2008-06-11
  • 打赏
  • 举报
回复
我觉得是和你定义的变量类型无关,只和你要输出的类型有关
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fetag 的回复:]
C/C++ code
printf("sizeof(int) == %d\n", sizeof(int));



自己看一下到底是多少,这个是最实际的!数据类型的长度是依赖于编译器的,间接上也与硬件有关...
[/Quote]
和编译器、硬件有关……
smallputin 2008-06-11
  • 打赏
  • 举报
回复
一样的啊,只是输出不一样的
[Quote=引用 10 楼 icansaymyabc 的回复:]
#include <stdio.h>
void main()
{
unsigned int a;
a=-2;
printf("%u\n",a);
}
a在内存的形式为0xfffffffe
#include <stdio.h>
void main()
{
int a;
a=-2;
printf("%d\n",a);
}
a在内存中和上面不一样。
[/Quote]
icansaymyabc 2008-06-10
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{
unsigned int a;
a=-2;
printf("%u\n",a);
}
a在内存的形式为0xfffffffe
#include <stdio.h>
void main()
{
int a;
a=-2;
printf("%d\n",a);
}
a在内存中和上面不一样。
hou1104 2008-06-09
  • 打赏
  • 举报
回复
和编译器有关吧
VC6里int就是占4字节 short 2字节
和unsign没关系
zbing0203 2008-06-09
  • 打赏
  • 举报
回复
int一般是一个机器字长 在32位机上一般就是32位
虽然在内存中一样但意思不一样 一个是无符号数4294967294 一个是有符数-2
你用printf("%ud",a)输出看下就知道了
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fetag 的回复:]
C/C++ code
printf("sizeof(int) == %d\n", sizeof(int));



自己看一下到底是多少,这个是最实际的!数据类型的长度是依赖于编译器的,间接上也与硬件有关...
[/Quote]
很直接!!
加载更多回复(6)

69,337

社区成员

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

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