turbo c中的二进制表示

Has*_*ell 1 c c++ turbo-c

我有一个非常基本的查询.对于以下代码:

int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler
Run Code Online (Sandbox Code Playgroud)

它不应该只是放下负号或者它是否包围了极限?

Ada*_*dam 6

最常用于表示负数的方案称为Two's Complement.在这个方案中-1有所有1位的位模式:1111 1111 1111 1111.当解释为无符号整数时,这就是你的强制转换意味着什么,那就是65535.

换句话说,它只是"简单地删除负号",除非这样做会产生与预期不同的效果.

  • 这并不能解释观察到的行为.将`j`(一个`unsigned int`)传递给'%d`说明符的`printf`,它需要一个`int`,它没有C或C++标准定义的行为.在这种情况下,大多数实现都会打印"-1",因为`unsigned int`与`int`在同一个地方传递,因此`printf`接收`unsigned int`的位,但将它们解释为`int `.那么"65535"是如何产生的呢? (2认同)
  • 我假设OP正在使用的C实现为`unsigned int`和`int`参数传递32位值(即使这些类型是16位)和`printf`,当它处理'%d`时,使用与`%ld`相同的代码.因此,所发生的是-1被转换为`unsigned int`,产生65535,并且这在内部扩展到32位以作为参数传递.然后,实际上,`printf`接收`long int` 65535并将其格式化为"65535". (2认同)