gpt4 book ai didi

c - 硬件如何知道一个变量是正数还是负数?

转载 作者:行者123 更新时间:2023-12-03 15:27:00 25 4
gpt4 key购买 nike

如果这个问题太基本,我很抱歉......我只是没有在任何地方找到答案。
假设我像这样声明了一个 C 变量:

unsigned int var = 241;
在这种情况下,var 是无符号的,所以我的目的是让它具有十进制值 241。
或者我可以这样声明:
signed int var = -15;
在这种情况下,我将其声明为有符号整数,因此根据我的理解,它应该具有十进制值 -15。
但是,这两次,我都假设 var 将在内存(硬件)中声明如下:
1111 0001。
那么处理器如何知道在硬件中的最低级别我打算将其声明为 241 还是 -15?
我知道用于表示负数等的二进制补码表示法,但是,我假设在硬件中,处理器只能看到一系列 1 和 0,然后通过切换某些 IC 的状态对其进行一些操作。处理器如何知道是解释标准二进制(无符号)还是 2 的补码(有符号)中的位序列?
还有另一个有点不相关的问题:
  • 在 C 中,我可以这样做:
    无符号整数 var = -15;
    printf("变量是:%d", var);
    这将按预期打印 -15。
    为什么,当我这样做时:

  • 有符号 int var = 0xF1;//或0b11110001
    printf("变量是:%d", var);
    我得到 241 而不是 -15?既然我将它声明为有符号的并且在二进制补码中 0xF1 是 -15 为什么我得到的值 241 相当于标准二进制中的 0xF1 ?
  • 为什么编译器让我做这样的事情:
    无符号整数 var = -15;

  • 它不应该抛出一个错误,告诉我我不能将负值分配给我声明为无符号的变量吗?
    谢谢你,我为我的许多可能是基本的问题道歉,我不知道的太多了:D。

    最佳答案

    硬件不知道。
    编译器知道。
    编译器知道,因为你在这里这么说 signed int var = -15; , “亲爱的编译器,这是一个可以为负的变量,我将其初始化为负值。”
    你说的不一样unsigned int var = 241; , “亲爱的编译器,这是一个不能为负的变量,我将它初始化为正值。”
    编译器将记住这一点,以便您以后对变量及其值进行任何操作。编译器会将所有相应的代码转换为机器语言中的那组指令,这将导致硬件做出相应的行为。所以硬件最终会做一些适合消极或不适合的事情;不是因为知道,而是因为没有选择。
    “相应指令”的一个有趣方面(正如 Peter Cordes 在下面的评论中所指出的)是,对于负值的 2 补码表示的特殊(但非常广泛使用)情况,指令实际上对于两者是相同的(这是 2-complement 的一个重要优势)。

    关于c - 硬件如何知道一个变量是正数还是负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66183115/

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