返回信息流int a = -3;
unsigned int b = 2;
long c = a + b;
printf("%ld\n",c); //0xffffffff
printf("%lu\n",c); // 0xffffffff
printf("%d\n",c) // -1
-3补码:1101
2 原码:0010
c: 补码:0xffffffff 对应:原码 100...1 即 -1.
so.....为什么ld 的输出和 lu 是一样的 ld不应该是signed的么
这是一条镜像帖。来源:北邮人论坛 / cpp / #90916同步于 2016/4/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
0XFFFFFFFF printf("%ld") printf("%d") 不一样
du5307
2016/4/8镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 du5307 的大作中提到: 】
: int a = -3;
: unsigned int b = 2;
: long c = a + b;
: ...................
int用%d
unsigned int用%u
long用%ld
unsigned long用%lu
这些不是可以互换,什么类型就要用对应的格式符。用混了的话,什么事都可能发生,从什么都不发生到机器冒烟都可能。所以,不要讨论“如果用错了会发生什么”。
C语言也没有规定负数使用补码表示法。尽管现在的机器普遍使用,但在C语言里有补码的行为,纯属偶然。
谢暖神…
赞这美丽的纯属偶然…
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: int用%d
: unsigned int用%u
: long用%ld
: ...................
long c =a + b
int 转unsigned int 做加法 得到32位的全是1
long也是32位
是这个么
【 在 lblbxuxu (达菲鸡) 的大作中提到: 】
: 低32位1高32位0
64位系统long64位
int加unsigned结果是unsigned ,所以转成long需要做0拓展
于是高32位是0
【 在 du5307 的大作中提到: 】
long c =a + b
int 转unsigned...
扩展知道
没想到的是64位系统的 long 和 long long 都是64位。。。。之前一直以为long 32位。。。
3q 3q
【 在 lblbxuxu 的大作中提到: 】
: 64位系统long64位
: int加unsigned结果是unsigned ,所以转成long需要做0拓展
: 于是高32位是0
: ...................