当前位置 : 主页 > 编程语言 > c语言 >

C语言无符号整数转换

来源:互联网 收集:自由互联 发布时间:2023-09-06
今天在学习C语言的位运算,位运算是要将数字转换成二进制,对操作数的每一位进行相应计算; 开篇 我定义了一个无符号整数60,对其进行按位取反的操作,程序输出为-61 // a = 0011 1100unsign

今天在学习C语言的位运算,位运算是要将数字转换成二进制,对操作数的每一位进行相应计算;

开篇

我定义了一个无符号整数60,对其进行按位取反的操作,程序输出为-61

	// a = 0011 1100
	unsigned int a = 60;
	int c = 0;
	c = ~a;
	// 1100 0011
	printf("逻辑非位计算:%d\n", c);

疑惑

当我看到-61的时候,就有点疑惑了,因为60的二进制是0011 1100,按位取反后为1100 0011,首位表示符号位,那么100 0011转换为二进制是67,答案应该是-67啊

恍然大悟

我仔细观察代码后发现,变量 a 的类型是 unsigned int,而变量 c 的类型是 int。 在这种情况下,对于无符号整数 a 进行按位取反操作时,结果会被解释为有符号整数。 由于 int 类型使用补码表示负数,因此按位取反后的结果是补码,我们需要根据补码求出来原码,才是最终的结果;也就是对补码 1100 0011进行转换得到原码1011 1101 ,被解释为有符号整数 -61。

因此,变量 c 的值确实是 -61。

上一篇:RDMA-MR内核接口-rxe_alloc_mr
下一篇:没有了
网友评论