size_t与int的相互赋值

时间:2021-03-28 17:06:02
我在32位平台XP系统下用VC2005新建了一个空的Win32 Console Application工程,然后定义了一个size_t类型的变量和一个int类型的变量进行相互赋值. 

我发现只有当size_t类型赋给int类型的时候系统有警告,反过来用int类型赋给size_t类型时没有.可是int类型是有符号的,而size_t类型是没有符号的, 这样赋值也应该有警告才对呀?

请大家指教! 谢谢!

7 个解决方案

#1


与所存储的最大数值有关。
小放进大,没问题!
大放进小,会有数据截取的可能。

#2


老邓真快。

#3


正因为存在数据的截断,因此我才觉得会出现隐藏的问题.

我曾经故意把-1赋值给一个size_t类型的变量,然后打印这个变量,值显然就是不对的. 但是这样的赋值却没有警告, 实在有点不正常. 请问这样的警告如何才可以打开呢?

#4


size_t unsigned int类型
int 是 signed int类型
the c programming language 规定 signed int 可以赋给unsigned int 而unsigned int 不能随便赋给signed int

个人理解这根计算机数据储存有关 带符号的数储存时要在第一位专门保存符号。不带符号的数赋给带符号的会导致第一位溢出。而带符号的数赋给不带符号的数则不会导致溢出

#5


无符号数表示的最大值比有符号数的最大值大

#6


数据存入存储空间中是以补码的形式存的。。
当a=b的时候,实际上是把b的补码存入了a的存储空间(&a)中,

而警告的问题是因为会有两种可能性吧:
1、数据截断
2、补码形式

个人理解,高人拍砖……

#7


引用楼主 kurama_xp 的回复:
我在32位平台XP系统下用VC2005新建了一个空的Win32 Console Application工程,然后定义了一个size_t类型的变量和一个int类型的变量进行相互赋值.

我发现只有当size_t类型赋给int类型的时候系统有警告,反过来用int类型赋给size_t类型时没有.可是int类型是有符号的,而size_t类型是没有符号的, 这样赋值也应该有警告才对呀?

请大家指教! 谢谢!


根本原因是,在C/C++中,从一个有符号整数转换到无符号整数时,转换规则是确定的,即使转换数值不在无符号数的表示范围内;但从一个无符号整数转换到有符号整数,当发生超出无符号数的表示范围时,转换结果是实现相关的。

4.7 Integral conversions [conv.integral]

2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there
is no truncation). ]

3 If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.

#1


与所存储的最大数值有关。
小放进大,没问题!
大放进小,会有数据截取的可能。

#2


老邓真快。

#3


正因为存在数据的截断,因此我才觉得会出现隐藏的问题.

我曾经故意把-1赋值给一个size_t类型的变量,然后打印这个变量,值显然就是不对的. 但是这样的赋值却没有警告, 实在有点不正常. 请问这样的警告如何才可以打开呢?

#4


size_t unsigned int类型
int 是 signed int类型
the c programming language 规定 signed int 可以赋给unsigned int 而unsigned int 不能随便赋给signed int

个人理解这根计算机数据储存有关 带符号的数储存时要在第一位专门保存符号。不带符号的数赋给带符号的会导致第一位溢出。而带符号的数赋给不带符号的数则不会导致溢出

#5


无符号数表示的最大值比有符号数的最大值大

#6


数据存入存储空间中是以补码的形式存的。。
当a=b的时候,实际上是把b的补码存入了a的存储空间(&a)中,

而警告的问题是因为会有两种可能性吧:
1、数据截断
2、补码形式

个人理解,高人拍砖……

#7


引用楼主 kurama_xp 的回复:
我在32位平台XP系统下用VC2005新建了一个空的Win32 Console Application工程,然后定义了一个size_t类型的变量和一个int类型的变量进行相互赋值.

我发现只有当size_t类型赋给int类型的时候系统有警告,反过来用int类型赋给size_t类型时没有.可是int类型是有符号的,而size_t类型是没有符号的, 这样赋值也应该有警告才对呀?

请大家指教! 谢谢!


根本原因是,在C/C++中,从一个有符号整数转换到无符号整数时,转换规则是确定的,即使转换数值不在无符号数的表示范围内;但从一个无符号整数转换到有符号整数,当发生超出无符号数的表示范围时,转换结果是实现相关的。

4.7 Integral conversions [conv.integral]

2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there
is no truncation). ]

3 If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.