如果这个问题太基础了,我很抱歉...我在任何地方都没有找到答案。
假设我像这样声明一个C变量:
unsigned int var = 241;
在这种情况下,变量是无符号的,因此我的意图是它应具有小数值241。
或者我可以这样声明:
signed int var = -15;
在这个例子中,我将其声明为有符号整数,因此按照我的理解它应该具有小数值-15。
然而两次,我假设变量将在内存(硬件)中声明为这样: 1111 0001。
那么处理器如何知道,在最低级别即硬件上,我打算将其声明为241还是-15呢? 我知道使用二进制补码表示负数等,但是我假设在硬件中,处理器只看到一系列的1和0,然后通过切换一些IC的状态执行某些操作。 处理器如何知道是否要将位序列解释为标准二进制(用于无符号)或2的补码(用于有符号)?
还有另一个稍微不相关的问题:
在C语言中,我可以这样做:
unsigned int var = -15; printf("The var is: %d ", var); 这将像预期的那样打印-15。 为什么当我这样做时:
signed int var = 0xF1; //或0b11110001 printf("The var is: %d ", var);
我得到了241而不是-15?既然我将其声明为有符号的,并且在二进制补码中0xF1是-15,为什么我得到等于标准二进制中的0xF1的值241?
- 为什么编译器让我这样做:
unsigned int var = -15;
它不应该抛出错误告诉我不能将负值赋给我声明为无符号的变量吗?
谢谢您,对于我的许多也许基本的问题,我表示歉意,我有很多不知道的东西:D。
unsigned int var = -15;
?因为C语言有规则,可以将超出范围(负数或大数)的整数隐式转换为无符号类型:模数归约到值范围内。(在2的补码机器上,这意味着对于运行时变量使用带符号的比特模式,但不适用于1的补码或符号/幅度C实现。) - Peter Cordes