Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ turboc中的二进制表示_C++_C_Turbo C - Fatal编程技术网

C++ turboc中的二进制表示

C++ turboc中的二进制表示,c++,c,turbo-c,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 它不应该简单地放弃否定的符号,还是绕过限制 最常用于表示负数的方案称为。在此方案中,-1具有所有1位的位模式:1111111111111111。当解释为无符号整数时,这就是强制转换的含义,即65535 换句话说,它确实

我有一个非常基本的问题。 对于以下代码:

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

它不应该简单地放弃否定的符号,还是绕过限制

最常用于表示负数的方案称为。在此方案中,
-1
具有所有
1
位的位模式:
1111111111111111
。当解释为无符号整数时,这就是强制转换的含义,即65535


换句话说,它确实“简单地去掉负号”,只是这样做的效果与您预期的不同。

最常用于表示负数的方案称为。在此方案中,
-1
具有所有
1
位的位模式:
1111111111111111
。当解释为无符号整数时,这就是强制转换的含义,即65535



换句话说,它确实“简单地删除负号”,但这样做的效果与您预期的不同。

当将
int
转换为
无符号int
时,如果该值为负值,则结果就好像该负值已添加到大于
无符号int
所能容纳值的数字1中。这是自C90起由C标准规定的,无论机器使用的是两个补码、一个补码还是有符号的幅值表示,都适用。

当将
int
转换为
无符号int
时,如果该值为负值,则结果就好像该负值已添加到大于
无符号int
所能容纳值的数字1中。自C90以来,这是由C标准规定的,无论机器使用的是两个补码、一个补码还是有符号的幅值表示,它都保持不变。

“它是否绕过了限制?”我想你已经为你的实施找到了答案already@imsoconfused:这不是实现定义的行为-它在标准中有很好的规定<代码>(未签名int)-1 < /代码>在机器上使用16位int,无论是机器是否使用两个补,都将是<代码> 65535 >代码。该代码的行为不是由C或C++标准定义的,因为 %D/<代码>说明符需要类型<代码> int >的参数,但是通过的参数<<代码> j>代码>has type
unsigned int
@MichaelBurr haha我不确定,所以我坚持使用含糊不清的措辞,必须是正确的,并将答案留给更了解情况的人“它是否绕过了限制?”我想你已经为你的实施找到了答案already@imsoconfused:这不是实现定义的行为-它在标准中有很好的规定<代码>(未签名int)-1 < /代码>在机器上使用16位int,无论是机器是否使用两个补,都将是<代码> 65535 >代码。该代码的行为不是由C或C++标准定义的,因为 %D/<代码>说明符需要类型<代码> int >的参数,但是通过的参数<<代码> j>代码>has type
unsigned int
@MichaelBurr haha我不确定,所以我坚持使用含糊不清的措辞,必须正确,并将答案留给更了解情况的人。这并不能解释观察到的行为。通过<代码> j>代码>,它是<代码>未签名的INT/COM>,到<代码> Prtff<代码> > %D说明符,要求<代码> int >代码>,没有由C或C++标准定义的行为。在这种情况下,大多数实现都会打印“-1”,因为
无符号int
int
在同一位置传递,因此
printf
接收
无符号int
的位,但将其解释为
int
。那么“65535”是如何产生的呢?我假设OP使用的C实现为
无符号int
int
参数传递32位值(即使这些类型是16位),并且
printf
在处理
%d
时使用与
%ld
相同的代码。因此,-1被转换成无符号整数,生成65535,并在内部扩展到32位作为参数传递。然后,实际上,
printf
接收
long int
65535并将其格式化为“65535”。这并不能解释观察到的行为。通过<代码> j>代码>,它是<代码>未签名的INT/COM>,到<代码> Prtff<代码> > %D说明符,要求<代码> int >代码>,没有由C或C++标准定义的行为。在这种情况下,大多数实现都会打印“-1”,因为
无符号int
int
在同一位置传递,因此
printf
接收
无符号int
的位,但将其解释为
int
。那么“65535”是如何产生的呢?我假设OP使用的C实现为
无符号int
int
参数传递32位值(即使这些类型是16位),并且
printf
在处理
%d
时使用与
%ld
相同的代码。因此,-1被转换成无符号整数,生成65535,并在内部扩展到32位作为参数传递。然后,实际上,
printf
接收
long int
65535并将其格式化为“65535”。这解释了为什么
j
的值为65535,而不是
printf(“%d”,j)
打印“65535”,因为
%d
@EricPostpischil传递了错误的类型。我没有注意到这一点。我怀疑这个问题可能没有实际的
printf()
code。或者也许我真的不知道turboc.FWIW的整个交易是什么(不是很多)-我实际上从Embarcadero下载了turboc2.01并运行了问题中的代码。它为我产生了
-1
。当然,不管默认选项是什么,都是这样