我发现只有当size_t类型赋给int类型的时候系统有警告,反过来用int类型赋给size_t类型时没有.可是int类型是有符号的,而size_t类型是没有符号的, 这样赋值也应该有警告才对呀?
请大家指教! 谢谢!
7 个解决方案
#1
与所存储的最大数值有关。
小放进大,没问题!
大放进小,会有数据截取的可能。
小放进大,没问题!
大放进小,会有数据截取的可能。
#2
老邓真快。
#3
正因为存在数据的截断,因此我才觉得会出现隐藏的问题.
我曾经故意把-1赋值给一个size_t类型的变量,然后打印这个变量,值显然就是不对的. 但是这样的赋值却没有警告, 实在有点不正常. 请问这样的警告如何才可以打开呢?
我曾经故意把-1赋值给一个size_t类型的变量,然后打印这个变量,值显然就是不对的. 但是这样的赋值却没有警告, 实在有点不正常. 请问这样的警告如何才可以打开呢?
#4
size_t unsigned int类型
int 是 signed int类型
the c programming language 规定 signed int 可以赋给unsigned int 而unsigned int 不能随便赋给signed 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、补码形式
个人理解,高人拍砖……
当a=b的时候,实际上是把b的补码存入了a的存储空间(&a)中,
而警告的问题是因为会有两种可能性吧:
1、数据截断
2、补码形式
个人理解,高人拍砖……
#7
根本原因是,在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类型的变量,然后打印这个变量,值显然就是不对的. 但是这样的赋值却没有警告, 实在有点不正常. 请问这样的警告如何才可以打开呢?
我曾经故意把-1赋值给一个size_t类型的变量,然后打印这个变量,值显然就是不对的. 但是这样的赋值却没有警告, 实在有点不正常. 请问这样的警告如何才可以打开呢?
#4
size_t unsigned int类型
int 是 signed int类型
the c programming language 规定 signed int 可以赋给unsigned int 而unsigned int 不能随便赋给signed 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、补码形式
个人理解,高人拍砖……
当a=b的时候,实际上是把b的补码存入了a的存储空间(&a)中,
而警告的问题是因为会有两种可能性吧:
1、数据截断
2、补码形式
个人理解,高人拍砖……
#7
根本原因是,在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.