unsigned int 可以存负数?

guangmingdeshenju 2011-04-06 09:56:22
unbelievable!

今天在 VJC下编机器人程序时,发现一怪事,unsigned int 型变量存负数,编译器竟没报错。
当时,以为只是 个别情况,回寝室又用gcc尝试了哈,没想到一样的结果:

#include"stdio.h"

void main(){
unsigned int cdc= 33;
cdc = cdc*(-1);
printf("unsigned int %d \r\n",cdc);
return;
}


还是输出了-33。无语?


...全文
1646 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
guangmingdeshenju 2011-04-14
  • 打赏
  • 举报
回复
转换其实不是问题所在,我想说的是编译器没有主动检查。
因为这样操作(*-1)实际就已将 unsigned int 转换成int了,所以即使输出
“%u”也是-33的无符号解释:4294967263。
16楼说得好,机器存数一视同仁,关键看怎么解释啦。
失落的凡凡 2011-04-07
  • 打赏
  • 举报
回复
类型只是对一块内存中数据的解释,signed和unsigned,占内存的大小都是一样的,区别只是符号位的含意不同。你怎么解释它,它就表现成什么样子。
yangch_nhcmo 2011-04-07
  • 打赏
  • 举报
回复

//printf("unsigned int %d \r\n",cdc);

printf("unsigned int %ud \r\n",cdc);

sdb134 2011-04-07
  • 打赏
  • 举报
回复
unsinged int 怎么可能存的是负数了,
引用 1 楼 bluesky12312388 的回复:

不是unsigned int 可以存负数。

是你这里 %d将它转换为int类型然后输出的。
如果想得到正确结果请用%ud



pathuang68 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluesky12312388 的回复:]

不是unsigned int 可以存负数。

是你这里 %d将它转换为int类型然后输出的。
如果想得到正确结果请用%ud
[/Quote]

说得好!
screwzm 2011-04-07
  • 打赏
  • 举报
回复
在内存里数据都是以2进制存储的,只不过输出的时候按照你给的格式符输出而已!所以存储什么都不重要,重要的是你怎么去操作数据!
AnYidan 2011-04-07
  • 打赏
  • 举报
回复
lz 设个断点,看看在哪里进行了类型转换
wyfwx 2011-04-07
  • 打赏
  • 举报
回复
在内存里的数据是没有符号的,符号只对人有用
xmu_才盛 2011-04-07
  • 打赏
  • 举报
回复
存的只是数据 0x01000021 而已, 计算机不知道什么是负数, 它只认识16进制数值。

是否为负数只是我们自己定义的而已, 我还说他是字符串呢!! 还可能是阿拉伯文呢,关键是你打印的方法就是打印整数%d,所以它就给你显示了

举一个简单的例子
0x697C4E3B
在大端系统里面, 可以是 unicode big end 字符串 “楼主” 二字
在小段系统里面,可以是unicode 字符串 “籩㭎” 二字

也可能是大端系统中的带符号整数 1769754171
还有可能是小段系统中带符号的整数 994999401

还有可能是utf-8编码中的字符串"i|N;"
也有可能是 Ansi字符编码中的 "i|N;"

还有可能是阿拉伯文,日文,韩文等等中的某个词语


关键看你怎么解释了,
tyr 2011-04-07
  • 打赏
  • 举报
回复
我把LZ的代码稍微改了下,用codeblcok在32位系统windows xp 上面运行了下结果如下:

代码:
//typeconvert.cpp
#include "stdio.h"

int main()
{
unsigned int cdc = 33;

int b,c;
b = (unsigned int)(cdc * (-1));
c = cdc * (-1);

printf("signed cdc: %d \r\n",cdc);
printf("unsigned cdc: %u \r\n\n",cdc);

printf("signed b: %d \r\n",b);
printf("unsigned b: %u \r\n\n",b);

printf("signed c: %d \r\n",c);
printf("unsigned c: %u \r\n\n",c);

printf("unsigned '-1' :%u \r\n",-1);

return 0;
}


结果:
signed cdc: 33
unsigned cdc: 33

signed b: -33
unsigned b: 4294967263

signed c: -33
unsigned c: 4294967263

unsigned '-1' :4294967295

Process returned 0 (0x0) execution time : 0.031 s
Press any key to continue.

似乎有无符号int的运算,负转换成正的int对结果没有影响。

xengine-qyt 2011-04-07
  • 打赏
  • 举报
回复
不能存 范围就不一样,这样是错的,汇编第二章就说了
huazai20081986 2011-04-07
  • 打赏
  • 举报
回复
楼主都是高手啊!我来学学你们的经验!
翻越寒武 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 delphiwcdj 的回复:]
引用 1 楼 bluesky12312388 的回复:

不是unsigned int 可以存负数。

是你这里 %d将它转换为int类型然后输出的。
如果想得到正确结果请用%ud

UP
[/Quote]
up
無_1024 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 delphiwcdj 的回复:]

引用 1 楼 bluesky12312388 的回复:

不是unsigned int 可以存负数。

是你这里 %d将它转换为int类型然后输出的。
如果想得到正确结果请用%ud

UP
[/Quote]
++1 你的输出的时候转换了一下
delphiwcdj 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluesky12312388 的回复:]

不是unsigned int 可以存负数。

是你这里 %d将它转换为int类型然后输出的。
如果想得到正确结果请用%ud
[/Quote]
UP
GoonYangXiaofang 2011-04-06
  • 打赏
  • 举报
回复
unsigned int 用 %u 输出
bluesky12312388 2011-04-06
  • 打赏
  • 举报
回复 1
不是unsigned int 可以存负数。

是你这里 %d将它转换为int类型然后输出的。
如果想得到正确结果请用%ud

69,368

社区成员

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

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