Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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++ C和C之间的类型转换差异++;?_C++_C_Type Conversion - Fatal编程技术网

C++ C和C之间的类型转换差异++;?

C++ C和C之间的类型转换差异++;?,c++,c,type-conversion,C++,C,Type Conversion,关于隐式类型转换的最后一个例子指出,std::cout稍微多考虑一下,就会意识到问题出在printf上,而不是转换本身。 请注意,编写的是printf(“%d”)。这执行了又一次转换回有符号整数,这就是为什么我看到了-5的结果 使用printf(“%u”)进行测试时,会显示预期结果(4294967291) 最后,printf(“%X”)产生了fffffff b,这意味着这两个值,具体取决于有符号或无符号解释 在C示例中,没有任何类型转换。C只计算表达式5u-10,并将结果推送到堆栈上。然后pri

关于隐式类型转换的最后一个例子指出,
std::cout稍微多考虑一下,就会意识到问题出在
printf
上,而不是转换本身。 请注意,编写的是
printf(“%d”)
。这执行了又一次转换回
有符号整数
,这就是为什么我看到了
-5
的结果

使用
printf(“%u”)
进行测试时,会显示预期结果(
4294967291


最后,
printf(“%X”)
产生了
fffffff b
,这意味着这两个值,具体取决于有符号或无符号解释

在C示例中,没有任何类型转换。C只计算表达式
5u-10
,并将结果推送到堆栈上。然后printf看到一个类型字符,并在打印时将堆栈上的值解释为该类型字符。类型字符是
d
%d
),意思是“十进制整数”,因此堆栈上的位置检索为int,并打印为(有符号的)十进制


例如,如果类型字符是
ld
%ld
),堆栈上的位置将被检索为long,即使只按下int,也会被打印为(有符号的)十进制数。同样,没有任何类型转换(只会打印一个无意义的数字)。

我想你的意思是“再次转换回有符号整数”
printf
不会根据格式说明符执行转换。它假定数据的类型正确,否则会导致未定义的行为。事实上,
int
无符号
的内部表示方式没有区别。这里并没有“转换”,只是按照类型处理相同的数据。为什么人们会这样做?在不使用2的补码的编译器中运行代码,意外的情况会发生,您将看到没有应用任何转换
printf
没有类型的概念,只是将字节视为指定的格式dc不是类型安全的,因此计算中会进行整数升级。至于
printf
,我同意你的看法-我的措辞不正确。@levengli,我相信对有符号或无符号整数都没有“提升”。默认情况下,计算是以整数的宽度(有符号或无符号)进行的。在常量表达式中,从数字5(无论有符号还是无符号)中减去数字10。减法“包装位”,结果是一个数字,如果解释为无符号,则该数字较大;如果解释为有符号,则该数字为-5。执行算术时,运算符的两侧需要具有相同的数据类型
5u
无符号
,而
10
有符号
(默认)。因此,将进行整数转换。参见c99第6.3.1.8节“常用算术转换”spec@levengli,这只是一个理论上的论证。无符号5、有符号5的位表示以及无符号10和有符号10的位表示是相同的。因此,没有真正的促销活动发生。我不在乎编译器是否会在内部使用浮点计算常量表达式,只要它将正确的结果放入对象文件(一组整数宽度的位,可以解释为无符号4294967291或有符号-5)。对于正数,您是正确的,
int
和不大于2^31的值