是否保证将-1赋值给无符号类型会产生最大值? 我发现了一些关于这个主题的问题,但是它们是关于C++的。
当阅读答案时,这似乎是可能的,或者至少不太可能,这是C和C++不同的地方之一。 问题很简单: 如果我用是否保证将-1赋值给无符号类型会产生最大值? 我发现了一些关于这个主题的问题,但是它们是关于C++的。,c,unsigned,C,Unsigned,当阅读答案时,这似乎是可能的,或者至少不太可能,这是C和C++不同的地方之一。 问题很简单: 如果我用unsigned char/short/int/long var声明一个变量,或者使用任何其他无符号类型,如固定宽度、最小宽度等,那么var=-1是否保证将var设置为它能保持的最大值?这个程序保证打印“是”吗 #包括 #包括 内部主(空){ 无符号长var=-1; printf(“%s\n”,var==ULONG_MAX?“是”:“否”); } 是否保证将-1赋值给无符号类型会产生最大值 对
unsigned char/short/int/long var
声明一个变量,或者使用任何其他无符号类型,如固定宽度、最小宽度等,那么var=-1
是否保证将var
设置为它能保持的最大值?这个程序保证打印“是”吗
#包括
#包括
内部主(空){
无符号长var=-1;
printf(“%s\n”,var==ULONG_MAX?“是”:“否”);
}
是否保证将-1赋值给无符号类型会产生最大值
对
这个程序保证打印“是”吗
对
它是从int
-1
到无符号长
的转换<代码>-1不能表示为无符号长代码
。发件人:
否则,如果新类型是无符号的,则会通过反复将新类型中可以表示的最大值加上或减去一个值来转换该值,直到该值在新类型的范围内
因此,我们在
-1
中添加一个(ULONG_MAX+1)
,得到-1+(ULONG_MAX+1)=ULONG_MAX
,其范围在无符号长根据C17 6.3.1.3,从-1
(有符号整数
)到大无符号类型的转换是明确定义的
否则,如果新类型是无符号的,则通过重复添加或
比新类型中可以表示的最大值多减去一个
直到值在新类型的范围内(60)
这附带了一个有用的脚注(60)
这些规则描述的是基于数学值的算术运算,而不是给定类型表达式的值
因此给定无符号长var=-1代码>,则该值变为
-1
然后再添加一个大于无符号long的最大值
- 意思是
-1
+ULONG_MAX+1
=U_LONG_MAX
这是定义良好的可移植行为。与从无符号到有符号的转换不同,它可以调用实现定义的行为
此外,这与符号格式无关,因为应该使用数学值,而不是原始二进制值。您是否做过类似于unsigned long var=(signed long)0xfffffff代码>那么,对于具有1的补码或符号大小的奇异/虚构系统来说,这将是另一个故事。但实际上,这不是它的重复吗?我想不是因为你提到了,但是这个答案字面上说,对无符号算术的要求保证了将-1转换为无符号类型将为目标类型产生尽可能多的数字
,答案也跟在后面,这在C和C++
@KamilCuk中是一样的,我认为最好保持这一点,因为它只关注C,你的答案非常好,而且直截了当地提到了参考资料。@KamilCuk它甚至明确地提到了C99标准:C99,§6.2.5/9
,所以它对C绝对有效,我们现在有了确定的Cversion@KamilCuk我个人不喜欢把C问题作为C++问题的一个问题来解决,因为C++问题的答案也提到它也适用于C。或者,你可以使用<代码> STNTT.H./Cord>类型,因为这些保证使用2的补语。代码>uint32_t var=(int32_t)0xfffffff
本身定义良好,但功能失调的外来系统实际上不需要提供int32\t
,它是一种可选类型。
#include <stdio.h>
#include <limits.h>
int main(void) {
unsigned long var = -1;
printf("%s\n", var == ULONG_MAX ? "Yes" : "No");
}