user-0 提问: c 类型转换

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:你虽然转换为无符号数，但是你还是以%d输出的，即还是以有符号数的形式输出来。问题在%d, 建议用%u或者%lu形式输出试试问你一下，那既然%d是有符号形式输出，为什么printf("%d\n", 2147483648);输出的还是-2147483648呢？？难道还转换了不成？为什么会被转换呢？

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:你虽然转换为无符号数，但是你还是以%d输出的，即还是以有符号数的形式输出来。问题在%d, 建议用%u或者%lu形式输出试试额！糊涂我了，我试试，谢了

user: user-1
content: 你虽然转换为无符号数，但是你还是以%d输出的，即还是以有符号数的形式输出来。问题在%d, 建议用%u或者%lu形式输出试试

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:注意，常量也有类型！ C++ Integer Constants  Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Grammar integer-constant:  decimal-constant integer-suffixopt  octal-constant integer-suffixopt  hexadecimal-constant integer-suffixopt  'c-char-sequence'  decimal-constant:  nonzero-digit   decimal-constant digit  octal-constant:  0  octal-constant octal-digit  hexadecimal-constant:  0xhexadecimal-digit  0Xhexadecimal-digit   hexadecimal-constant hexadecimal-digit  nonzero-digit: one of  1 2 3 4 5 6 7 8 9  octal-digit: one of  0 1 2 3 4 5 6 7  hexadecimal-digit: one of  0 1 2 3 4 5 6 7 8 9   a b c d e f   A B C D E F  integer-suffix:  unsigned-suffix long-suffixopt  long-suffix unsigned-suffixopt  unsigned-suffix: one of  u U  long-suffix: one of  l L  64-bit integer-suffix:  i64 LL ll  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:    Copy Code  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal    To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:    Copy Code  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit    To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the "x" does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:    Copy Code  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i    To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:    Copy Code  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value    To specify a 64-bit integral type, use the LL, ll or i64 suffix. For example,    Copy Code  // 64bitsuffix.cpp #include <stdio.h> enum MyEnum {    IntType,    Int64Type };  MyEnum f1(int) {    printf("in f1(int)\n");    return IntType; }  MyEnum f1(__int64) {    printf_s("in f1(__int64)\n");    return Int64Type; }  int main() {    MyEnum t1 = f1(0x1234), t2 = f1(0x1234i64); }    Output    in f1(int) in f1(__int64)    See Also Concepts Literals (C++)额！我刚学，被搞晕乎了，谢谢赵4老师

user: user-2
content: 注意，常量也有类型！ C++ Integer Constants  Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Grammar integer-constant:  decimal-constant integer-suffixopt  octal-constant integer-suffixopt  hexadecimal-constant integer-suffixopt  'c-char-sequence'  decimal-constant:  nonzero-digit   decimal-constant digit  octal-constant:  0  octal-constant octal-digit  hexadecimal-constant:  0xhexadecimal-digit  0Xhexadecimal-digit   hexadecimal-constant hexadecimal-digit  nonzero-digit: one of  1 2 3 4 5 6 7 8 9  octal-digit: one of  0 1 2 3 4 5 6 7  hexadecimal-digit: one of  0 1 2 3 4 5 6 7 8 9   a b c d e f   A B C D E F  integer-suffix:  unsigned-suffix long-suffixopt  long-suffix unsigned-suffixopt  unsigned-suffix: one of  u U  long-suffix: one of  l L  64-bit integer-suffix:  i64 LL ll  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:    Copy Code  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal    To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:    Copy Code  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit    To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the "x" does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:    Copy Code  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i    To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:    Copy Code  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value    To specify a 64-bit integral type, use the LL, ll or i64 suffix. For example,    Copy Code  // 64bitsuffix.cpp #include <stdio.h> enum MyEnum {    IntType,    Int64Type };  MyEnum f1(int) {    printf("in f1(int)\n");    return IntType; }  MyEnum f1(__int64) {    printf_s("in f1(__int64)\n");    return Int64Type; }  int main() {    MyEnum t1 = f1(0x1234), t2 = f1(0x1234i64); }    Output    in f1(int) in f1(__int64)    See Also Concepts Literals (C++)

user: user-1
content: 引用 8 楼 zgw2014 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 3 楼 zgw2014 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 你虽然转换为无符号数，但是你还是以%d输出的，即还是以有符号数的形式输出来。问题在%d, 建议用%u或者%lu形式输出试试问你一下，那既然%d是有符号形式输出，为什么printf("%d\n", 2147483648);输出的还是-2147483648呢？？难道还转换了不成？为什么会被转换呢？ [/quote] 注意一下，这个2147483648是不是已经超出int有符号数正整数表示的范围了。可以查阅一下int类型的表示的范围。[/quote]它没有超出正数表示范围，刚好等于2的31次方，根据无符号数转换成有符号数的规则，x >= 2的（w-1）次方，结果就是 x - 2的w次方，使用%d输出的结果就是-2147483648[/quote] 注意，最高位不是数值位，而是符号位。若为1则是负值。

user: user-0
content: 问下各位兄弟姐妹，针对超出系统最大整数值得数该怎么转换？比如 (unsigned) -2147483648 < 21474836487 这个运算的结果是多少？有点疑惑，跪求各位分析一下

user: user-0
content: 引用 6 楼 fight_in_dl 的回复:基本数据类型能表达的数字有限制，具体多少和编译器对C++标准的具体实现以及机器字长有关。 可以用： cout<<INT_MAX<<endl; 看看这个极值是多少，再检查题目中的数字是否已经超出。  printf格式字符串这个知识点的内容挺多的，详细可参考： https://msdn.microsoft.com/zh-cn/library/tcxf1dw6.aspx好的，感谢

user: user-3
content: 因为打印的是%d,这个是有符号打印

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 3 楼 zgw2014 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 你虽然转换为无符号数，但是你还是以%d输出的，即还是以有符号数的形式输出来。问题在%d, 建议用%u或者%lu形式输出试试问你一下，那既然%d是有符号形式输出，为什么printf("%d\n", 2147483648);输出的还是-2147483648呢？？难道还转换了不成？为什么会被转换呢？ [/quote] 注意一下，这个2147483648是不是已经超出int有符号数正整数表示的范围了。可以查阅一下int类型的表示的范围。[/quote]它没有超出正数表示范围，刚好等于2的31次方，根据无符号数转换成有符号数的规则，x >= 2的（w-1）次方，结果就是 x - 2的w次方，使用%d输出的结果就是-2147483648

user: user-0
content: 引用 4 楼 g62r83t27 的回复:很明显，这个数是心机boy写出来的，编译告警被你忽略了，请用%ld试试使用%ld输出确实是原值，2147483648这个值正好是2的31次方，转换一下是-2147483648

user: user-4
content: 基本数据类型能表达的数字有限制，具体多少和编译器对C++标准的具体实现以及机器字长有关。 可以用： cout<<INT_MAX<<endl; 看看这个极值是多少，再检查题目中的数字是否已经超出。  printf格式字符串这个知识点的内容挺多的，详细可参考： https://msdn.microsoft.com/zh-cn/library/tcxf1dw6.aspx

user: user-1
content: 引用 3 楼 zgw2014 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 你虽然转换为无符号数，但是你还是以%d输出的，即还是以有符号数的形式输出来。问题在%d, 建议用%u或者%lu形式输出试试问你一下，那既然%d是有符号形式输出，为什么printf("%d\n", 2147483648);输出的还是-2147483648呢？？难道还转换了不成？为什么会被转换呢？ [/quote] 注意一下，这个2147483648是不是已经超出int有符号数正整数表示的范围了。可以查阅一下int类型的表示的范围。

user: user-5
content: 很明显，这个数是心机boy写出来的，编译告警被你忽略了，请用%ld试试