gpt4 book ai didi

c - 为什么我的程序打印 fffffff0?

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:11 24 4
gpt4 key购买 nike

我试图理解为什么我的程序

#include<stdio.h>    
void main()
{
printf("%x",-1<<4);
}

打印 fffffff0 .

这个程序在做什么,<< 是做什么的?运营商呢?

最佳答案

<<运算符是左移运算符; a<<b 的结果是a移至 b 的左侧位。

您的代码的问题是您左移了一个负整数,这会导致未定义的行为(尽管您的编译器可能会对此操作提供一些保证);还有,%x用于以十六进制形式打印一个无符号整数,而您正在向它提供一个有符号整数 - 同样是未定义的行为。

至于为什么你会看到你所看到的:关于 2 的补码架构 -1表示为“全部”;所以,在 32 位 int 的计算机上你将拥有:

11111111111111111111111111111111 = -1 (if interpreted as a signed integer)

现在,如果将其移动到 4 个位置的左侧,您将得到:

11111111111111111111111111110000

%x说明符使 printf将这些东西解释为一个无符号整数,以十六进制表示,它是 0xfffffff0 .这很容易理解,因为 4 个二进制数字等于一个十六进制数字; 1111二进制组变为 f在十六进制中,最后一个 0000二进制是最后一个 0十六进制。

同样,这里解释的所有这些行为只是您的特定编译器 的工作方式,就 C 标准而言,这都是 UB。这是非常有意的:历史上不同的平台有不同的方式来表示负数,并且各种处理器的移位指令有不同的微妙之处,因此我们为移位运算符获得的“定义的行为”或多或少是大多数人共有的“安全子集” “正常”架构。

关于c - 为什么我的程序打印 fffffff0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com