unsigned int和int之间的运算

jiemo1123 2013-05-04 12:35:57
#include <stdio.h>

int main()
{
unsigned int nA = 10;
int nB = -19;
unsigned int nC = 0;

nC = nA + nB;

if(nC > 0)
{
printf("%d\n", nC);
}
while(1);
return 0;
}

这个打印出来的结果是-9,有符号数和无符号数运算,不是会自动转化成无符号的吗?那真心想不通这个结果。。。nC大于0成立了,可是打印出来的确实-9,请大神赐教,谢谢!
...全文
552 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-05-08
  • 打赏
  • 举报
回复
%d表示什么意思?
starforce08 2013-05-08
  • 打赏
  • 举报
回复
nc只是栈上一段4字节的内存。nA+nB后得到的结果0xfffffff7存在这块内存上。0xfffffff7用int来解释是-9。但由于nc是unsigned的,所以在进行nc>0的比较时,编译器没有按照int的形式解释这块内存,从而nc是大于0的。但是printf时,输出的格式能够通过参数来定义,所以%d就是-9,而%u就是4294967287。
farmliver 2013-05-08
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:

#include <stdio.h>

int main()
{
	unsigned int nA = 10;
	int nB = -19;
	unsigned int nC = 0;

	nC = nA + nB;

	if(nC > 0)
	{
		printf("%u\n", nC);//%d就意味着把nC当作int来解释。。改为%u就当无符号十进制解释。。
	}
	while(1);
        return 0;
}
++
赵4老师 2013-05-08
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
JoeBlackzqq 2013-05-07
  • 打赏
  • 举报
回复

[root@Fedora13 tc]# cat a.c
#include <stdio.h>

int main()
{
        unsigned int nA = 10;
        int nB = -19;
        unsigned int nC = 0;

        nC = nA + nB;

        if(nC > 0)
        {
                printf("%d, %u, %#x\n", nC, nC, nC);
        }
        return 0;
}
[root@Fedora13 tc]# make
gcc -o a a.c
[root@Fedora13 tc]# ./a
-9, 4294967287, 0xfffffff7
[root@Fedora13 tc]# 
二零一四Tenc 2013-05-07
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:

#include <stdio.h>

int main()
{
	unsigned int nA = 10;
	int nB = -19;
	unsigned int nC = 0;

	nC = nA + nB;

	if(nC > 0)
	{
		printf("%u\n", nC);//%d就意味着把nC当作int来解释。。改为%u就当无符号十进制解释。。
	}
	while(1);
        return 0;
}
+1
lm_whales 2013-05-07
  • 打赏
  • 举报
回复
PS:同样长度的无符号数和有符号数,不需要任何转换,只是意义不同,数据其实是一样的。 unsigned x=-1; unsigned x=(unsigned)-1; int y=-1; unsigned x=y; 这几个表达式实际上都没做什么转换。 直接初始化而已。 虽然unsigned x=(unsigned)-1; 明确使用了类型转换运算符,实际上,编译器根本就不安排任何的数据转换代码。
lm_whales 2013-05-07
  • 打赏
  • 举报
回复
nC = nA + nB; /* 这个是运算,整型数的加减,无符号和有符号数,并无区别 */ if(nC > 0) /*这个只是不输出 0,无符号数,只有0 不比0 大。 */ { printf("%d\n", nC); /*这个是选择 printf 函数看到你要求按照整型(带符号数)输出,只能输出负数了。 printf("%u\n", nC);这个会输出无符号数。 */ }
hugett 2013-05-04
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
	unsigned int nA = 10;
	int nB = -19;
	unsigned int nC = 0;

	nC = nA + nB;

	if(nC > 0)
	{
		printf("%u\n", nC);//%d就意味着把nC当作int来解释。。改为%u就当无符号十进制解释。。
	}
	while(1);
        return 0;
}
xiao0915 2013-05-04
  • 打赏
  • 举报
回复
%u or use cout
buyong 2013-05-04
  • 打赏
  • 举报
回复
printf("%d\n", nC); //这是把nC当有符号的数来输出。内部做了转换。 建议用cout << nC << endl
combobox2013 2013-05-04
  • 打赏
  • 举报
回复
引用 5 楼 jxzoufeng 的回复:

#include <stdio.h>

void main()
{
	short a = -1;
	unsigned short int b = a;

	printf("%u,%d\n", b, b);
}
同求,为什么我这个输出的b都是65535, 而把short 换成int 之后 %d得到的-1??
b原本就是 -1+ 65536--->65535 所以%u的结果是65535 但是%d这里,再次将b当做一个int 或者short int来看。 此时所做的动作,恢复为有符号数的short int,所以是-1了。 红色的东西,是我揣测的。 具体看printf的实现了。 文档说:printf : %d是看做一个整数,但是没有说是int 还是short int?
jxzoufeng 2013-05-04
  • 打赏
  • 举报
回复

#include <stdio.h>

void main()
{
	short a = -1;
	unsigned short int b = a;

	printf("%u,%d\n", b, b);
}
同求,为什么我这个输出的b都是65535, 而把short 换成int 之后 %d得到的-1??
derekrose 2013-05-04
  • 打赏
  • 举报
回复
换个思路,如果你是编译器,你假定nc是unsigned,那么你会比较nc和0的大小么
折翼断JJ 2013-05-04
  • 打赏
  • 举报
回复
负数是以它的补码存储的,所以是一个大于1的数字。所以存的时候n>0,而你输出的时候是按"%d"整数形式输出,因为在内存中int类型最高位为1,被当做符号位,所以输出的时候会输出它的原码也就是一个负数。LS说得对,改成"%d"按无符号输出则int类型的最高位就不会被当做符号位了,就会输出一个整数了。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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