簡體   English   中英

C中的類型轉換查詢

[英]type conversion query in C

為什么以下代碼將 a 的值打印為 -25536 而不是 -25535。 我的猜測是,要在短范圍內標准化短值,它應該執行 40000-32767 = 7233,然后從第一個范圍開始,即 -32768+7233 = -25535,那么額外的值從哪里來? 為什么是-25536?

#include <stdio.h>
int main()
{
    short  int a = 40000;
    printf("%d", a);
    return 0;
}

在 C 2018 標准中,6.3.1.3 3 表示將無法在類型中表示的值轉換為有符號 integer 類型是實現定義的。 GCC 定義轉換為模 2 N換行,其中N是類型的寬度(類型中的位數,包括符號位)。

在您使用的 C 實現中, short int有 16 位,因此轉換包含模 2 16 = 65,536。 所以 40,000 通過減去 65,536 所需的次數轉換為short int以產生范圍(-32,768 到 +32,767)中的值,即只有一次:40,000−65,536 = −25,536。

請注意,純二進制中 40,000 的位是 1001 1100 0100 0000(2 15 + 2 12 + 2 11 + 2 10 + 2 6 = 32,768 + 4,096,+ 2,048 + 1,024 + 64 = 40,000)。 當解釋為二進制補碼時,前導位表示 -32,768 而不是 +32,768,因此二進制補碼中相同位的解釋為 -32,768 + 4,096,+ 2,048 + 1,024 + 64 = -25,536。 這以及二進制補碼和二進制的算術屬性與 GCC 選擇包裝模 2 N的原因有關。

首先,正確的代碼是

printf("%hd", a);

如果你啟用了它的警告,你的編譯器會警告你這個問題。 gcc甚至給出了解決方案。


絕對不能保證獲得 -25,536。 但這就是正在發生的事情。

在具有 32 位int vars 的 little-endian 2's-complement 機器上, 40000存儲為字節40 9C 00 00

在具有 16 位short變量的 little-endian 2's-complement 機器上,字節40 9C表示 -25536。

不執行任何操作。


你的問題的關鍵二是二的補碼 你應該發現這個早期的問答最相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM